设计了一个小的案例:上传图片到服务器,上传成功后显示图片列表,然后点击下载上传到服务器的图片。
注意表单的配置属性:
<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 }