Java開發之文件上傳

wn25 9年前發布 | 4K 次閱讀 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);  

        }  

    }  

 本文由用戶 wn25 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!