WebUploader的java后端上傳代碼(支持分片上傳)

hwl0420 8年前發布 | 3K 次閱讀 Java commons-fileupload

用到了apache的fileupload組件
</div>

 

[Java]代碼    

public void fileUpload(HttpServletRequest request,
            HttpServletResponse response) throws ServletException {
        try {
            String path = request.getParameter("path");
            path = path != null ? java.net.URLDecoder.decode(path, "utf-8")
                    : "";
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);

            if (isMultipart) {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);

                // 得到所有的表單域,它們目前都被當作FileItem
                List<FileItem> fileItems = upload.parseRequest(request);

                String id = "";
                String fileName = "";
                // 如果大于1說明是分片處理
                int chunks = 1;
                int chunk = 0;
                FileItem tempFileItem = null;

                for (FileItem fileItem : fileItems) {
                    if (fileItem.getFieldName().equals("id")) {
                        id = fileItem.getString();
                    } else if (fileItem.getFieldName().equals("name")) {
                        fileName = new String(fileItem.getString().getBytes(
                                "ISO-8859-1"), "UTF-8");
                    } else if (fileItem.getFieldName().equals("chunks")) {
                        chunks = NumberUtils.toInt(fileItem.getString());
                    } else if (fileItem.getFieldName().equals("chunk")) {
                        chunk = NumberUtils.toInt(fileItem.getString());
                    } else if (fileItem.getFieldName().equals("file")) {
                        tempFileItem = fileItem;
                    }
                }

                // 臨時目錄用來存放所有分片文件
                String tempFileDir = getTempFilePath()
                        + File.separator + id;
                File parentFileDir = new File(tempFileDir);
                if (!parentFileDir.exists()) {
                    parentFileDir.mkdirs();
                }
                // 分片處理時,前臺會多次調用上傳接口,每次都會上傳文件的一部分到后臺(默認每片為5M)
                File tempPartFile = new File(parentFileDir, fileName + "_" + chunk
                        + ".part");
                FileUtils.copyInputStreamToFile(tempFileItem.getInputStream(),
                        tempPartFile);

                // 是否全部上傳完成
                // 所有分片都存在才說明整個文件上傳完成
                boolean uploadDone = true;
                for (int i = 0; i < chunks; i++) {
                    File partFile = new File(parentFileDir, fileName + "_" + i
                            + ".part");
                    if (!partFile.exists()) {
                        uploadDone = false;
                    }
                }
                // 所有分片文件都上傳完成
                // 將所有分片文件合并到一個文件中
                if (uploadDone) {
                    File destTempFile = new File(getTempFilePath(), fileName);
                    for (int i = 0; i < chunks; i++) {
                        File partFile = new File(parentFileDir, fileName + "_"
                                + i + ".part");

                        FileOutputStream destTempfos = new FileOutputStream(
                                destTempFile, true);

                        FileUtils.copyFile(partFile, destTempfos);

                        destTempfos.close();
                    }
                    // 得到 destTempFile 就是最終的文件
                    // 添加到文件系統或者存儲中

                    // 刪除臨時目錄中的分片文件
                    FileUtils.deleteDirectory(parentFileDir);
                    // 刪除臨時文件
                    destTempFile.delete();

                    ResponseUtil.responseSuccess(response, null);
                } else {
                    // 臨時文件創建失敗
                    if (chunk == chunks -1) {
                        FileUtils.deleteDirectory(parentFileDir);
                        ResponseUtil.responseFail(response, "500", "內部錯誤");
                    }
                }
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            ResponseUtil.responseFail(response, "500", "內部錯誤");
        }
    }
 本文由用戶 hwl0420 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!