小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Servlet中文件上傳的幾種方式

 一本正經(jīng)地胡鬧 2019-07-05

  上傳文件,因為上傳的都是二進制數(shù)據(jù),所以在Servlet中就不能直接用request.getParameter();方法進行數(shù)據(jù)的獲取,需要借助第三方j(luò)ar包對上傳的二進制文件進行解析。常用的方式如下:

一:使用SmartUpload.jar

  它是一個商業(yè)類庫,解析request過程中,數(shù)據(jù)是存放在內(nèi)存中的,因此速度比較快,但是上傳大文件的時候會出現(xiàn)內(nèi)存溢出。

二:commons-fileupload.jar (Apache commons)、commons-io.jar

UploadFileServlet .java
復(fù)制代碼
public class UploadFileServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("請以POST方式訪問該URL");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設(shè)置請求和響應(yīng)的編碼格式
        String encoding = getServletContext().getInitParameter("encoding");
        req.setCharacterEncoding(encoding);
        resp.setCharacterEncoding(encoding);
        resp.setContentType("text/html");
        
        //核心Api
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        
        //判斷是否是muitipart/form-data類型
        if(!ServletFileUpload.isMultipartContent(req)) {
            resp.getWriter().println("表單的enctype屬性不是multipart/form-data類型");
        }
        
        //設(shè)置單個文件上傳大小 2M
        fileUpload.setFileSizeMax(2*1024*1024); 
        //設(shè)置總上傳文件大小(有時候一次性上傳多個文件,需要有一個上限,此處為10M)
        fileUpload.setSizeMax(10*1024*1024);
        //設(shè)置上傳監(jiān)聽器[參數(shù)為自定義的監(jiān)聽器]
        fileUpload.setProgressListener(new ListenerUploadProgress());
        //解析請求
        try {
            List<FileItem> parseRequest = fileUpload.parseRequest(req);
            //獲取數(shù)據(jù)
            for (FileItem fileItem : parseRequest) {
                //判斷數(shù)據(jù)類型是不是普通的form表單字段
                if(!fileItem.isFormField()) {
                    //上傳文件
                    String fileName = fileItem.getName();
                    InputStream fileStream = fileItem.getInputStream();
                    //定義保存的父路徑
                    String parentDir = this.getServletContext().getRealPath("/WEB-INF/upload");
                    //使用UUID+文件名的方式,避免文件重名
                    String realFileName = UUID.randomUUID().toString()+"-"+fileName;
                    //創(chuàng)建要保存的文件
                    File file = new File(parentDir,realFileName);
                    //判斷文件夾是否存在
                    if(!file.getParentFile().exists()) {
                        //創(chuàng)建文件夾[多級文件夾]file.madir是創(chuàng)建單一文件夾
                        file.getParentFile().mkdirs();
                    }
                    
                    //創(chuàng)建輸出流
                    OutputStream out = new FileOutputStream(file);
                    //創(chuàng)建字節(jié)緩存
                    byte[] buffer = new byte[1024];
                    int len = -1;
                    //一次讀取1kb(1024byte),返回-1表明讀取完畢
                    while((len = fileStream.read(buffer))!=-1) {
                        //一次寫入1kb(1024byte)
                        out.write(buffer,0, len);
                    }
                    
                    //沖刷流資源
                    out.flush();
                    //關(guān)閉流
                    out.close();
                    fileStream.close();
                    
                }else {
                    //普通字段
                    
                    //字段名
                    String fieldName = fileItem.getFieldName();
                    //字段值
                    String fieldValue = fileItem.getString();
                    System.out.println(fieldName+":"+fieldValue);
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }        
    }
}
復(fù)制代碼
ListenerUploadProgress.java
復(fù)制代碼
public class ListenerUploadProgress implements ProgressListener {
    
    /**
     * @param bytesRead 已經(jīng)讀取的字節(jié)數(shù)
     * @param contentLength 文件總長度
     * @param items 當(dāng)前上傳的是哪個文件
     */
    @Override
    public void update(long bytesRead, long contentLength, int items) {
        System.out.println(bytesRead);
        System.out.println(contentLength);
        System.out.println(items);
    }
    
    //*前端可以根據(jù)該信息寫一個上傳進度條
}
復(fù)制代碼

 

 https://www.cnblogs.com/wooyoohoo/p/9464570.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多