Java开发之文件上传详解编程语言

依赖2个jar包:commons-fileupload,commons-io。

代码如下:

    package com.example.web;   
       
    import java.io.File;   
    import java.io.FileOutputStream;   
    import java.io.IOException;   
    import java.io.InputStream;   
    import java.io.OutputStream;   
    import java.io.PrintWriter;   
    import java.text.DateFormat;   
    import java.text.SimpleDateFormat;   
    import java.util.Date;   
    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.FileUploadException;   
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;   
    import org.apache.commons.fileupload.servlet.ServletFileUpload;   
    import org.apache.commons.io.IOUtils;   
       
    public class FileUpload extends HttpServlet {   
       
        public void doGet(HttpServletRequest request, HttpServletResponse response)   
                throws ServletException, IOException {   
               
            request.setCharacterEncoding("UTF-8");   
            response.setContentType("text/html;charset=utf-8");   
            PrintWriter out=response.getWriter();   
            //指定文件存放目录   
            String storePath=getServletContext().getRealPath("WEB-INF/files");   
            File file=new File(storePath);   
            //如果目录不存在,需要创建   
            if(!file.exists()){   
                file.mkdirs();   
            }   
            //要检查是不是enctype=multipart/form-data提交过来的数据   
            boolean isMultipart=ServletFileUpload.isMultipartContent(request);   
            //如果不是,需要处理   
            if(!isMultipart){   
                out.write("请将enctype设置成multipart/form-data类型");   
                response.setHeader("Refresh", "1;URL="+request.getContextPath());   
                return;   
            }   
            //去生成一个文件上传的FileUpload对象   
            DiskFileItemFactory factory=new DiskFileItemFactory();   
            //设置一个临时目录   
            //factory.setRepository(new File("E:/temp"));temp文件需要临时创建,我已经删掉了   
               
            ServletFileUpload upload=new ServletFileUpload(factory);   
            //将用户的请求转化为List<FileItem>   
            try {   
                List<FileItem> items=upload.parseRequest(request);   
                //遍历List<FileItem>中的数据   
                for (FileItem item : items) {   
                    //如果部分文件没有上传   
                    if("".equals(item.getName())){   
                        continue;   
                    }   
                    //判断是普通字段   
                    if(item.isFormField()){   
                        String fieldName=item.getFieldName();   
                        String fieldValue=item.getString("UTF-8");   
                        System.out.println(fieldName+":"+fieldValue);   
                    }else{   
                        //是上传的文件   
                        //需要获取文件名,有可能是路径   
                        String fileName=item.getName();   
                        fileName=fileName.substring(fileName.lastIndexOf(File.separator)+1);   
                        //文件名同名问题   
                        fileName=UUID.randomUUID().toString()+"_"+fileName;   
                        //解决一个文件夹下的文件过多的问题   
                        //用时间来生成子目录   
                        //String childPath=generateDir(storePath);   
                        //用hashcode来生成子目录   
                        String childPath=generateDir(storePath,fileName);   
                        //获取上传文件的数据   
                        InputStream is=item.getInputStream();   
                        OutputStream os=new FileOutputStream(storePath+File.separator+childPath+File.separator+fileName);   
                        IOUtils.copy(is, os);   
                        os.close();   
                        is.close();   
                        //item.delete();//清空临时文件   
                    }   
                }   
                out.write("文件上传成功<a href='"+request.getContextPath()+"'>继续上传</a>");   
            } catch (FileUploadException e) {   
                e.printStackTrace();   
            }   
        }   
       
       
        private String generateDir(String storePath, String fileName) {   
            int hashcode=fileName.hashCode();   
            int dir1=hashcode &  0xf;   
            int dir2=(hashcode & 0xf0)>>4;   
            String childPath=dir1+File.separator+dir2;   
            File file=new File(storePath,childPath);   
            if(!file.exists()){   
                file.mkdirs();   
            }   
            return childPath;   
        }   
       
       
        private String generateDir(String storePath) {   
            DateFormat df=new SimpleDateFormat("yyyyMMddhhmmss");   
            String childPath=df.format(new Date());   
            File file=new File(storePath, childPath);   
            if(!file.exists()){   
                file.mkdirs();   
            }   
            return childPath;   
        }   
       
       
        public void doPost(HttpServletRequest request, HttpServletResponse response)   
                throws ServletException, IOException {   
            this.doGet(request, response);   
       
        }   
       
    }  

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/10380.html

(0)
上一篇 2021年7月19日 10:12
下一篇 2021年7月19日 10:12

相关推荐

发表回复

登录后才能评论