设计了一个小的案例:上传图片到服务器,上传成功后显示图片列表,然后点击下载上传到服务器的图片。
注意表单的配置属性:
<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
原标题:struts—文件的上传和下载
关键词:Struts