javaweb文件上传

来源:互联网 发布:淘宝联盟加入购物车 编辑:程序博客网 时间:2024/05/17 22:16

  1. ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

上传的jsp表单  注意格式一定要是:enctype="multipart/form-data"  表示上传文件


<form action="${pageContext.request.contextPath }/servlet/UploadServlet"  enctype="multipart/form-data" method="post">
    用户名:<input type="text" name="username"/><br/>
    上传文件1:<input type="file" name="file1"/> <br/>
    上传文件2:<input type="file" name="file2"/> <br/>
    <input type="submit" value="上传"/>
</form>


注意:
1、上传文件名的中文乱码和上传数据的中文乱码
2、为保证服务器安全,上传文件应该在外界无法直接访问的目录
3、为防止文件覆盖现象发生,要为上传文件产生一个唯一的文件名
4、为防止一个目录下文件太多,要用hash算法打散
5、限制文件上传的最大值
6、想保证临时文件删除用item.delete();
7、限制文件类型,在收到文件名时判断后缀名
8、监听文件上传速度




package cn.dream.web.controller;


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


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


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


public class UploadServlet extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //当表单的content-type=multipart/form-data时无法通过这种方式获取属性,必须通过流
       /* String username = request.getParameter("username");
        System.out.println(username);
        
        InputStream in = request.getInputStream();
        int len = 0;
        byte[] buff = new byte[1024];
        while((len=in.read(buff))>0){
            System.out.println(new String(buff,0,len));
        }
        
        in.close();*/
        try {
            //取得解析器工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setRepository(new File(this.getServletContext().getRealPath("/WEB-INF/temp")));
            //取得解析器
            ServletFileUpload upload = new ServletFileUpload(factory);
            
            
//            upload.setFileSizeMax(1024);        //设置上传的最大文件
            upload.setProgressListener(new ProgressListener() {
                
                @Override
                public void update(long pBytesRead, long pContentLength, int pItems) {
                    System.out.println("总大小:" + pContentLength + ",以上传:" + pBytesRead);
                }
            });
            //如果该request中的不是文件上传而是普通表单
            upload.setHeaderEncoding("UTF-8");          //设置解析码表解决上传文件名乱码
            if(!upload.isMultipartContent(request)){
                return;  //暂时先return  以后说
            }
            //如果是上传文件则解析request里的内容
            List<FileItem> list = upload.parseRequest(request); //取得list集合
            
            for(FileItem item : list){
                if(item.isFormField()){     //如果是普通表单数据
                    String name = item.getFieldName();      //取得属性名
                    String value = item.getString();        //取得属性值
                    value = new String(value.getBytes("iso8859-1"),"utf-8");    //解决上传提交表单乱码
                    System.out.println(name + "=" + value);
                }else{                                      //如果是文件
                    String filename = item.getName();       //文件可能是绝对路径
                    if(filename == null || filename.trim().equals("")){
                        continue;
                    }
                    filename = filename.substring(filename.lastIndexOf("\\")+1);//截取文件名
                    filename = makeFileName(filename);
                    InputStream in = item.getInputStream();
                    String dir = this.getServletContext().getRealPath("/WEB-INF/upload");
                    dir = makeDir(filename,dir);
                    FileOutputStream out = new FileOutputStream(dir + "\\" + filename);
                    int len = 0;
                    byte[] buff = new byte[1024];
                    while((len=in.read(buff))>0){
                        out.write(buff, 0, len);
                    }
                    in.close();
                    out.close();
                    item.delete();          //当文件上传成功后删除临时文件
                }
            }
        }catch (FileUploadBase.FileSizeLimitExceededException e) {
            request.setAttribute("message", "文件大小超过最大限制!!!!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            return;
        }
        catch (FileUploadException e) {
            e.printStackTrace();
        }    
    }


    
    
    private String makeDir(String filename, String dir) {
        
        int hashcode = filename.hashCode();
        int dir1 = hashcode&0xf;
        int dir2 = (hashcode&0xf0)>>4;
        dir = dir + "\\" + dir1 + "\\" + dir2;
        File file = new File(dir);      //利用file类判断文件是否存在,不在的话就创建
        if(!file.exists()){
            file.mkdirs();
        }
        return dir;
    }






    private String makeFileName(String filename) {
        return UUID.randomUUID().toString() + "_" + filename;
    }


    


    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {


        doGet(request, response);
    }
}
0 0
原创粉丝点击