一、文件上传
思想:图片是以流的方式进行读取,上传的图片存放在服务器端的某个文件夹中,数据库中保存的是上传的图片的地址。
1.ActionForm(userForm)
private FormFile p_w_picpath;//用于封装从jsp页面传过来的文本类型的属性
2.pojo(User)
private String path;//用于存放上传图片的地址,数据库中需要添加存放该地址的字段
3.jsp
<html:form action=" " enctype="multipart/form-data">//form设置了enctype属性后就是二进制传输数据了
<html:file property="p_w_picpath"></html:file>
</html:form>
4.action
String basePath=this.getServlet().getServletContext().getRealPath("/");//获得服务器的基路径
String path="/uploadImage/"+userService.picturePath(userForm.getImage());//上传图片保存的相对路径,图片 名通过userService中的picturePath方法进行处理
String endString=userForm.getImage().getFileName().substring
(userForm.getImage().getFileName().lastIndexOf(".")+1);//获取图片的后缀名
5.service(userService)
if("jpg".equals(endString)||"png".equals(endString)||"gif".equals(endString)||"JPG".equals(endString)||
"PNG".equals(endString)||"GIF".equals(endString)){//限制上传图片的类型
userDAO.saveImage(p_w_picpath,basePath,path);//保存图片
user.setPath(path);//将上传图片的路径(地址)进库
}else{
user.setPath(" ");//上传的图片不符合要求,在数据库中设置为空
}
6.dao(userDAO)
public String picturePath(FormFile p_w_picpath){//处理上传的图片名,UUIDGenerator详见相关日志
String filename=" ";//初始化变量
UUIDGenerator g=new UUIDGenerator();//创建UUIDGenerator类的一个对象
filename=p_w_picpath.getFileName();//将图片的文件名赋值给变量
if(filename.length()>0){
filename=filename.substring(filename.lastIndexOf("."));//将文件名除了后缀名的部分赋给filename变量
}
filename=(String)g.generate()+filename;//对上传的图片文件名进行处理,以免出现上传的图片名相同
return filename;
}
public void saveImage(FormFile p_w_picpath,String basePath,String path) throws IOException{//上传图片
FileOutputStream fos=null;//文件输出流
BufferedInputStream in=null;//缓冲的输入流
BufferedOutputStream out=null;//缓冲的输出流
try {
fos=new FileOutputStream(basePath+path);//创建一个向指定File对象表示的文件中写入数据的输出流
in=new BufferedInputStream(p_w_picpath.getInputStream());//创建BufferedInputStream并保存其参数,即输入流 in,以便将来使用
out=new BufferedOutputStream(fos);//创建一个新的缓冲输出流,以将数据写入指定的基础输出流
byte[] buf=new byte[8192];//创建一个字节缓冲数组,用于指定每次写入的字节大小(8192=8k)
int readSize;
while((readSize=in.read(buf))!=-1){//判断缓冲数组中是否还有数据
out.write(buf, 0, readSize);//将指定buf数组中从偏移量0开始的readSize个字节写入此缓冲的输出流
out.flush();//关闭缓冲的输出流
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(out!=null){
try {
out.close();
} catch (RuntimeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(in!=null){
try {
in.close();
} catch (RuntimeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(fos!=null){
try {
fos.close();
} catch (RuntimeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
二、文件删除
思路:上传的文件存放在某个文件夹中,该图片的地址存放在数据库中,因此,在删除图片的时候,不仅要删除它在数据库中的地址,而且还要删除在文件夹中的文件,删除图片之前要获取该图片的绝对路径。
1.action(userAction)
String basepath=this.getServlet().getServletContext().getRealPath("/");//获得服务器基路径
2.service(userService)
userDAO.deleteImage(uId,basepath);//删除图片
userDAO.deleteUser(uId);//删除图片在数据库中的路径
3.dao(userDAO)
public void deleteImage(Integer uId,String basepath){
User user=this.getUserById(uId);//取出某个用户对象(获得图片的相对路径)
String path=user.getPath();//将图片的相对路径赋值
if(path!=null){
File file=new File(basepath+path);//根据绝对路径创建一个文件对象
file.delete();//删除文件
}
}
三、修改文件
思路:先将原来的图片删除,然后重新上传一张图片
1.jsp(edit.jsp)
<html:hidden property="path"/>//获得原来图片的路径放在隐藏域中(尤其要注意)
<html:file property="p_w_picpath"/>
2.action(userAction)
String basepath=this.getServlet().getServletCotext().getRealPath("/");//获得服务器基路径
String path=null;
if(userForm.getImage().getFileSize()>0){//判断是否需要修改图片
path="/uploadImage/"+userForm.getImage();
}
userService.modify(basepath,path,userForm.getImage());//调用修改的方法
3.service(userService)
if(user.getPath()!=null&&path!=null){//需要修改图片的情况
userDAO.deleteImage(basepath+path);//根据绝对路径删除图片
userDAO.saveImage(p_w_picpath,basepath,path);//根据相对路径重新上传一张图片
user.setPath(path);//将新路径保存到user对象中
}
userDAO.modify(id,user);
4.dao(userDAO)方法同上
Struts实现单文件上传、修改、删除(以图片为例)
转载
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Struts2实现单文件上传,多文件上传与下载(十)
勿以恶小而为之,勿以善小而不为--------------------------刘备劝诸君,多行
单文件上传 多文件上传 显示可下载文件列表 下载文件 struts -
Struts2中的缓存----以Injector为例
题外话,文章中有大量的标识1 标识2,大家可以用ctrl+f来查找。构成缓存的类主要就是以
struts2 缓存 ConcurrentHashMap Strategy ThreadLocal -
[Java基础]-- struts2实现单文件或者多文件上传和单文件下载
一、struts2实现上传文件1、单文件上传 (1)java代码private File uploadImage; //jsp中
struts2上传和下载文件 struts html 文件名 -
struts2.0实现文件上传
struts2.0因为封装得比较深,文件上传比servlet要麻烦些。
职场 休闲 文件上传 struts2.0 -
目标文件--以ELF文件为例对段简介
1.什么是段? 目标文件中的内容至少有编译后的机器指令代码、数据。没错,除
段 代码段 数据段 COMMON块 目标文件