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

Mysqlnot nullunique在一起自动转为主键

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 Struts
29  * Creation date: 08-23-2016
30  * 
31  * XDoclet definition:
32  * @struts.action
33  */
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 stub
39         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          //读取文件并写出到服务器路径file
58          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 block
85             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 block
44                 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 block
72                 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 block
27             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 block
59             e.printStackTrace();
60             return al;
61         }
62         
63     }
64 
65 }
View Code

 

posted @ 2016-08-23 22:16  开拖拉机的蜡笔小新  阅读(431)  评论(0编辑  收藏  举报