文件上传

来源:互联网 发布:极限编程特点 编辑:程序博客网 时间:2024/06/05 05:14
package com.refitcar.mgr.community_topic.servlet;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


import com.common.Constants;
import com.common.Helper;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;


public class CommunityServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {


private static final long serialVersionUID = 1L;


@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
System.out.println("开始");
        request.setCharacterEncoding("utf-8");  
        //获得磁盘文件条目工厂。  
        DiskFileItemFactory factory = new DiskFileItemFactory();  
        //获取文件上传需要保存的路径,upload文件夹需存在。  
        String path = request.getSession().getServletContext().getRealPath(Constants.COMMUNITY_TOPIC_MOBILE_PHONE);  
        File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
System.out.println("地址"+path);
        //设置暂时存放文件的存储室,这个存储室可以和最终存储文件的文件夹不同。因为当文件很大的话会占用过多内存所以设置存储室。  
        factory.setRepository(new File(path));  
        //设置缓存的大小,当上传文件的容量超过缓存时,就放到暂时存储室。  
        factory.setSizeThreshold(2048*2048);  
        //上传处理工具类(高水平API上传处理?)  
        ServletFileUpload upload = new ServletFileUpload(factory);  
          
        try{  
            //调用 parseRequest(request)方法  获得上传文件 FileItem 的集合list 可实现多文件上传。  
            List<FileItem> list = upload.parseRequest(request);  
            System.out.println(list);
            for(FileItem item:list){  
                //获取表单属性名字。  
                String name = item.getFieldName();  
                //如果获取的表单信息是普通的文本信息。即通过页面表单形式传递来的字符串。  
                if(item.isFormField()){  
                    //获取用户具体输入的字符串,  
                    String value = item.getString();  
                    request.setAttribute(name, value);  
                }  
                //如果传入的是非简单字符串,而是图片,音频,视频等二进制文件。  
                else{   
                    //获取路径名  
                    String value = item.getName();  
                    //取到最后一个反斜杠。  
                    int start = value.lastIndexOf("\\");  
                    //截取上传文件的 字符串名字。+1是去掉反斜杠。  
                    String filename = value.substring(start+1);  
                    request.setAttribute(name, filename);  
                      System.out.println("获取文件名"+filename+"sasas"+name);
                      String newfileName = new StringBuffer(UUID.randomUUID().toString().replace("-", ""))
      .append(Helper.getFileSuffix(filename)).toString();
                    /*第三方提供的方法直接写到文件中。 
                     * item.write(new File(path,filename));*/  
                    //收到写到接收的文件中。  
                    File a=new File(path,newfileName);    
                    OutputStream out = new FileOutputStream(a);  
                    InputStream in = item.getInputStream();  
                    int length = 0;  
                    byte[] buf = new byte[1024];  
                    System.out.println("获取文件总量的容量:"+ item.getSize());  
                    response.getWriter().print(Constants.COMMUNITY_TOPIC_MOBILE_PHONE+newfileName);
                    while((length = in.read(buf))!=-1){  
                        out.write(buf,0,length);  
                    }  
                    in.close();  
                    out.close();  
                }  
            }  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
          
    }  
}
0 0
原创粉丝点击