你的位置:首页 > Java教程

[Java教程]struts—文件的上传和下载


设计了一个小的案例:上传图片到服务器,上传成功后显示图片列表,然后点击下载上传到服务器的图片。

注意表单的配置属性:

<form enctype="multipart/Form-data" action="/strutsFilleupAndDown/register.do" method="post">

         名字:<input type="text" name="name"><br>

         头像:<input type="file" name="myphoto"><br>

        <input type="submit" value="注册用户">

   </form>

注意UserForm表单中设置的属性类型相匹配:

private String name;
private FormFile myphoto;

 

问题:1.中文名字的文件?  2.存在文件覆盖? 

*1.覆盖文件的问题?

思路:

①为了防止新取得的文件名称重复,先看有没有该文件,如果有了,则给以后上传的文件去一个名字,为了防止文件名称重复(年+月+日+时分秒)

②编写一个工具类,可以生成一个不重复的文件名,然后再保存

public class Mytools {

public static String getNewFileName(String fileName){

int beginIndex=fileName.lastIndexOf(".");

String newFilename=UUID.randomUUID().toString()+fileName.substring(beginIndex,fileName.length());

return newFilename;

  }

}

在action中,调用方法即可。

 

*2.如果文件名是中文怎么办? 

思路:

①上传的时候使用过滤器转成utf-8编码,使得服务器能够识别文件,方便处理。

②在数据库中设计一个中间转换的一个表,存放原文件名和通过处理的文件名。

③下载的时候由于<img>请求是get请求,而过滤器对get请求时不生效的,文件名还是乱码,服务器无法识别文件,导致无法读取文件。在action中进行处理。

java.net.URLEncoder.encode(user.getPhoto2(),"utf-8")

Users表

Mysql中not null和unique在一起自动转为主键

Create table users_2( 

Username varchar(64) unique not null,

Photo varchar(128) not null,

Photo2 varchar(128) not null

)

 

文件上传action:

 1 /* 2  * Generated by MyEclipse Struts 3  * Template path: templates/java/JavaClass.vtl 4 */ 5 package com.xidian.struts.action; 6  7 import java.io.FileNotFoundException; 8 import java.io.FileOutputStream; 9 import java.io.IOException;10 import java.io.InputStream;11 import java.io.OutputStream;12 13 import javax.servlet.http.HttpServletRequest;14 import javax.servlet.http.HttpServletResponse;15 16 import org.apache.struts.action.Action;17 import org.apache.struts.action.ActionForm;18 import org.apache.struts.action.ActionForward;19 import org.apache.struts.action.ActionMapping;20 import org.apache.struts.upload.FormFile;21 22 import com.xidian.domain.Users;23 import com.xidian.service.UserService;24 import com.xidian.struts.form.UserForm;25 import com.xidian.utils.Mytools;26 27 /** 28  * MyEclipse Struts29  * Creation date: 08-23-201630  * 31  * XDoclet definition:32  * @struts.action33 */34 public class RegisterAction extends Action {35   36   public ActionForward execute(ActionMapping mapping, ActionForm form,37       HttpServletRequest request, HttpServletResponse response) {38     // TODO Auto-generated method stub39     UserForm userForm=(UserForm)form;40     String name=userForm.getName();41     FormFile formFile=userForm.getMyphoto();42     //通过formFile我们可以获取用户上传文件的各种信息43     String filename=formFile.getFileName();44     int fileSize=formFile.getFileSize();45     String NewFileName=Mytools.getNewFileName(filename);46     System.out.println(NewFileName+""+fileSize);47     //获取输入流48     InputStream is=null;49     OutputStream os=null;50    try {51     is=formFile.getInputStream();52     //得到一个输出流->文件53     //1.得到file文件夹上传到tomcat服务器的绝对路径54     String saveFilePath=this.getServlet().getServletContext().getRealPath("/file");55     System.out.println("saveFilePath="+saveFilePath);56     os=new FileOutputStream(saveFilePath+"\\"+NewFileName);57     //读取文件并写出到服务器路径file58     int len=0;59     //做一个buffer缓存60     byte[] bytes=new byte[1024];61     //循环处理62     while((len=is.read(bytes))>0){63       //读一点写一点64       os.write(bytes, 0, len);65      }  66     //如果用户的头像上传到数据库中,我们就保存到数据库中67     UserService userService=new UserService();68     Users user= new Users();69      user.setUsername(name);70     user.setPhoto(NewFileName); //保存新的文件名71      user.setPhoto2(filename);72     if(userService.addUser(user)){73       return mapping.findForward("ok");74     }75                     76    } catch (Exception e) {    77     e.printStackTrace();78     79    } finally{80      try {81         os.close();82       is.close();83     } catch (IOException e) {84       // TODO Auto-generated catch block85       e.printStackTrace();86     }87     }88    89    return mapping.findForward("err");90    91   }92 }

View Code

文件下载action:

 1 /* 2  * Generated by MyEclipse Struts 3  * Template path: templates/java/JavaClass.vtl 4 */ 5 package com.xidian.struts.action; 6  7 import java.io.FileInputStream; 8 import java.io.FileNotFoundException; 9 import java.io.IOException;10 import java.io.OutputStream;11 import java.io.UnsupportedEncodingException;12 13 import javax.servlet.http.HttpServletRequest;14 import javax.servlet.http.HttpServletResponse;15 16 import org.apache.struts.action.Action;17 import org.apache.struts.action.ActionForm;18 import org.apache.struts.action.ActionForward;19 import org.apache.struts.action.ActionMapping;20 21 import com.xidian.domain.Users;22 import com.xidian.service.UserService;23 24 public class DownloadAction extends Action {25 26   public ActionForward execute(ActionMapping mapping, ActionForm form,27       HttpServletRequest request, HttpServletResponse response) {    28 29     //获取用户的名称30     String username=request.getParameter("user");31     //获取user对象32     UserService userService=new UserService();33     Users user=userService.getUser(username);34       35     response.setContentType("text/html;charset=utf-8");36     37       //如果文件名有中文,需要对其进行url编码  38     String name=null;      39               40       try {41         response.setHeader("Content-Disposition", "attachment;filename="+ java.net.URLEncoder.encode(user.getPhoto2(),"utf-8"));42       } catch (UnsupportedEncodingException e1) {43         // TODO Auto-generated catch block44         e1.printStackTrace();45       }46     47     //下载文件48     //1.先获取到要下载文件的绝对路径49     String filePath=this.getServlet().getServletContext().getRealPath("/file");50     String fileAllPath=filePath+"\\"+user.getPhoto();51     FileInputStream fis=null;52     OutputStream os=null;53     byte[] buffer=new byte[1024];54     int len=0;55     try {56       57       fis=new FileInputStream(fileAllPath);58       os=response.getOutputStream();59       while((len=fis.read(buffer))>0){60         os.write(buffer, 0, len);61       }62       63     } catch (Exception e) {64       65       e.printStackTrace();66     } finally{67       try {68         os.close();69         fis.close();70       } catch (IOException e) {71         // TODO Auto-generated catch block72         e.printStackTrace();73       }74       75     }76     77     return mapping.findForward("back");78   }79 }

View Code

疑问?

在文件下载的时候含中文名字的文件不能下载,查找方法用:

response.setHeader("Content-Disposition", "attachment;filename="+ java.net.URLEncoder.encode(user.getPhoto2(),"utf-8"));

对获取到的文件名进行编码,并没能解决,报出错误:

java.lang.NullPointerException java.net.URLEncoder.encode

没能找出原因。

 

UserService代码:

 1 package com.xidian.service; 2  3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.util.ArrayList; 6  7  8 import com.xidian.domain.Users; 9 import com.xidian.utils.SqlHelper;10 11 public class UserService {12   public Users getUser(String username){13     Users user=new Users();14     String sql="select * from users_2 where username=?";15     String[] parameters={username};16     ResultSet rs=SqlHelper.executeQuery(sql, parameters);17     try {18       if(rs.next()){19         20         user.setUsername(rs.getString(1));21         user.setPhoto(rs.getString(2));22         user.setPhoto2(rs.getString(3));23         return user;24       }25     } catch (SQLException e) {26       // TODO Auto-generated catch block27       e.printStackTrace();28     }29     return user;30   }31   32   public boolean addUser(Users user){33     boolean b=true;34     String sql="insert into users_2 values (?,?,?)";35     String parameters[]={user.getUsername(),user.getPhoto(),user.getPhoto2()};36     try{37     SqlHelper.executeUpdate(sql, parameters);38     }catch(Exception e){39       b=false;40     }41     return b;42   }43   44   public ArrayList getUserList(){45     String sql="select * from users_2";46     ResultSet rs=SqlHelper.executeQuery(sql, null);47     ArrayList al=new ArrayList();48     try {49       while(rs.next()){50         Users users=new Users();51         users.setUsername(rs.getString(1));52         users.setPhoto(rs.getString(2));53         users.setPhoto2(rs.getString(3));54         al.add(users);55       }56       return al;57     } catch (SQLException e) {58       // TODO Auto-generated catch block59       e.printStackTrace();60       return al;61     }62     63   }64 65 }

View Code