Java WEB ----- 文件的上传

最近学到的web阶段的文件的上传,就想记录一下,帮助自己复习以及帮助大家学习,一般我都会把上传的文件存到服务器中的web-inf 下面,因为这样用户不会直接访问到,我们存到数据库的一般都是路径。这里没有演示数据库上传路径,气势上传路径很简单,只需要你把路径和文件名插入到数据库中的某个表就可以了,等你到时候想用找到文件的时候,就从数据库中查找路径就行了。废话不说,上代码(上传文件的servlet,前台界面只需要有一个类型为file的 input标签,如果想一次选上传多个,可以多写几个input或者在input标签内 增加multiple="multiple" 属性,就可以实现一个input中写入好几个文件):

  1 package practice;
  2 
  3 import java.io.File;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.io.UnsupportedEncodingException;
  8 import java.util.List;
  9 import java.util.UUID;
 10 
 11 import javax.servlet.ServletException;
 12 import javax.servlet.http.HttpServlet;
 13 import javax.servlet.http.HttpServletRequest;
 14 import javax.servlet.http.HttpServletResponse;
 15 
 16 import org.apache.commons.fileupload.FileItem;
 17 import org.apache.commons.fileupload.FileUploadBase;
 18 import org.apache.commons.fileupload.FileUploadException;
 19 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 20 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 21 import org.apache.commons.io.FilenameUtils;
 22 
 23 
 24 
 25 public class UploadServlet extends HttpServlet {
 26 
 27     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 28          //判断表单上传的方式  是否是 multipart/form-data;
 29         boolean ismultipartContent = ServletFileUpload.isMultipartContent(request);
 30         if(!ismultipartContent){
 31             throw new RuntimeException("your form is not multipart/form-data");
 32         }
 33         //创建一个DiskFileItemFactory工厂类
 34         DiskFileItemFactory factory = new DiskFileItemFactory();
 35         //创建一个临时文件存储的目录
 36         String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp"); 
 37         File  tempFile = new File(tempPath);
 38         if(!tempFile.exists()){
 39             tempFile.mkdir();
 40         }
 41         factory.setRepository(tempFile);
 42         //创建ServletFileUoload 核心对象
 43         ServletFileUpload  sfu = new ServletFileUpload(factory);
 44         //解决文件上传乱码问题
 45         sfu.setHeaderEncoding("utf-8");
 46         try {
 47         sfu.setFileSizeMax(1024*1024*3);  //单个文件大小
 48         sfu.setSizeMax(1024*1024*6);      //总文件大小
 49         //遍历表单集合返回一个List<FileItem>集合
 50         List<FileItem> fileItems = sfu.parseRequest(request);
 51         for(FileItem fileItem:fileItems){
 52             //判断是普通表单还是上传表单
 53             if(fileItem.isFormField()){
 54                 //按照普通表单处理
 55                 processFormField(fileItem);
 56             }else{
 57                 //按照上传表单来处理
 58                 processUploadField(fileItem);
 59             }
 60         }
 61         }catch(FileUploadBase.FileSizeLimitExceededException e){
 62             e.printStackTrace();
 63             request.setAttribute("message", "单个文件超出最大值");
 64             request.getRequestDispatcher("/uploadSong.jsp").forward(request, response);
 65             return;
 66         }catch(FileUploadBase.SizeLimitExceededException e){
 67             e.printStackTrace();
 68             request.setAttribute("message", "上传文件的总大小超出限制");
 69             request.getRequestDispatcher("/uploadSong.jsp").forward(request, response);
 70             return;            
 71         } 
 72         catch (FileUploadException e) {
 73             // TODO Auto-generated catch block
 74             e.printStackTrace();
 75         } //遍历表单项集合
 76         
 77         
 78     }
 79 
 80     
 81     
 82     //处理上传文件的函数
 83     private void processUploadField(FileItem fileItem) {
 84         //得到上传文件的名字
 85         String filename = fileItem.getName();
 86         //得到文件输入流
 87         try {
 88             InputStream is = fileItem.getInputStream();
 89             //将文件保存在服务器上
 90             String directoryRealPath =this.getServletContext().getRealPath("/WEB-INF/upload");//创建的路径
 91             File storeDirectory = new File(directoryRealPath);
 92             if(!storeDirectory.exists()){
 93                 storeDirectory.mkdir(); //创建一个指定目录
 94             }
 95             //处理文件名
 96             //filename =filename.substring(filename.lastIndexOf(File.separator)+1);
 97             if(filename!=null){
 98                 filename=FilenameUtils.getName(filename);
 99             }
100             //不让文件名重复
101             filename=UUID.randomUUID()+"_"+filename;
102             //打散目录
103             String childDirectory = makChildDirectory(storeDirectory,filename);
104             
105             //构建一个完整的文件路径
106             /*File file =new File(storeDirectory,childDirectory+File.separator+filename);
107             //创建一个写的流,将图片写入路径
108             FileOutputStream fos = new FileOutputStream(file);
109             int len=0;
110             byte [] buf = new byte[1024];
111             while((len=is.read(buf))!=-1){
112                 fos.write(buf,0,len);
113             }
114             fos.close();
115             is.close();*/
116             //用工具类实现文件上传操作
117             fileItem.write(new File(storeDirectory,childDirectory+File.separator+filename));
118             fileItem.delete();//删除临时文件
119         } catch (Exception e) {
120             // TODO Auto-generated catch block
121             e.printStackTrace();
122         }
123     }
124     
125     
126     //打散目录
127     private String makChildDirectory(File storeDirectory, String filename) {
128         int hashcode = filename.hashCode();
129         //把hashcode转换成16进制
130         String code = Integer.toHexString(hashcode);
131         String childDirectory = code.charAt(0)+File.separator+code.charAt(1);
132         File file = new File(storeDirectory,childDirectory);
133         if(!file.exists()){
134             file.mkdirs();
135         }
136         return childDirectory;
137     }
138 
139 
140 
141     //处理普通表单的函数
142     private void processFormField(FileItem fileItem) {
143         //解决文件名字乱码问题
144         try {
145             String fieldName = fileItem.getFieldName(); //获取字段名
146             //String fieldValue = fileItem.getString();   //获取值
147             String fieldValue  = fileItem.getString("utf-8");
148         } catch (UnsupportedEncodingException e) {
149             // TODO Auto-generated catch block
150             e.printStackTrace();
151         }
152     }
153 
154     
155     
156     
157     public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
158 
159         doGet(request, response);
160     }
161 
162 }

 

转载于:https://www.cnblogs.com/Leroyo/p/8157582.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值