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 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 }
文件下载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 }
疑问?
在文件下载的时候含中文名字的文件不能下载,查找方法用:
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 }