美文网首页
java文件上传通用(分片)

java文件上传通用(分片)

作者: 薄益达 | 来源:发表于2017-11-22 13:23 被阅读421次
/**
 * 
 * 上传通用
 * 
 * */
@RequestMapping(value = "/reportUploader", method = RequestMethod.POST)
public void uploadMajInnovation(HttpServletRequest request, HttpServletResponse response, @RequestParam("access_token") String access_token) {
    Teacher teacher = (Teacher) request.getServletContext().getAttribute(access_token);
    teacher.getSchoolNumber();
    try {
        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("multiFile")) {
                    tempFileItem = fileItem;
                }
            }
            String filePath = ConfigUtil.static_dir + teacher.getSchoolNumber() + "/development/";
            String realname = fileName.substring(0, fileName.lastIndexOf("."));
            // 临时目录用来存放所有分片文件
            String tempFileDir = filePath + File.separator + id;
            File parentFileDir = new File(tempFileDir);
            if (!parentFileDir.exists()) {
                parentFileDir.mkdirs();
            }
            // 分片处理时,前台会多次调用上传接口,每次都会上传文件的一部分到后台
            File tempPartFile = new File(parentFileDir, realname + ".part");
            FileUtils.copyInputStreamToFile(tempFileItem.getInputStream(), tempPartFile);
            // 是否全部上传完成
            // 所有分片都存在才说明整个文件上传完成
            boolean uploadDone = true;
            for (int i = 0; i < chunks; i++) {
                File partFile = new File(parentFileDir, realname+ ".part");
                if (!partFile.exists()) {
                    uploadDone = false;
                }
            }
            // 所有分片文件都上传完成
            // 将所有分片文件合并到一个文件中
            if (uploadDone) {
                File destfile = new File(filePath);
                if (!destfile.exists()) {
                    destfile.mkdirs();
                }
                
                // 得到 destTempFile 就是最终的文件
                File destTempFile = new File(filePath, realname + "."+ fileName.substring(fileName.lastIndexOf(".") + 1));
                File partFile = new File(parentFileDir, realname + ".part");
                
                if(!destTempFile.exists()){
                    for (int i = 0; i < chunks; i++) {
                        FileOutputStream destTempfos = new FileOutputStream(destTempFile, true);
                        // 遍历"所有分片文件"到"最终文件"中
                        FileUtils.copyFile(partFile, destTempfos);
                        destTempfos.close();
                    }
                }
                
                //文件重命名(时间戳)
                Long newname = new Date().getTime();
                destTempFile.renameTo(new File(filePath, newname + "."+ fileName.substring(fileName.lastIndexOf(".") + 1)));
                
                request.getSession().removeAttribute("EnterpriseFile");
                // 将文件信息存储在session中
                CareerPlanFile cpf = new CareerPlanFile();
                cpf.setFileName(fileName);
                cpf.setFilePath(destTempFile.getAbsolutePath());
                request.getSession().setAttribute("EnterpriseFile", cpf);
                // 删除临时目录中的分片文件
                FileUtils.deleteDirectory(parentFileDir);
                
                
            } else {
                // 临时文件创建失败
                if (chunk == chunks - 1) {
                    FileUtils.deleteDirectory(parentFileDir);
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

相关文章

  • java文件上传通用(分片)

  • 文件分片上传.md

    文件分片上传 文件分片上传的总体思路是 先将文件通过blob.slice()方法将文件切割成多个分片。然后循环上传...

  • 阿里oss文件分片上传

    OSS文件分片上传 依赖 基础参数dto 具体上传方法 小文件上传 大文件上传,分片oss自己处理 处理逻辑:前段...

  • webuploader前端分片上传

    前端分片上传附件 分片上传定义: 所谓的分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块...

  • JS分片上传

    JS分片上传 //分片上传 function ScarecrowPatchUpload (uploadPath, ...

  • js文件分片上传

    知识点:File,Blob,FileReader,hash,promisify,async, await 文件Fi...

  • 分片上传文件处理

    此需要基于webuploader.js插件 1. 前端代码 2. 后端代码 3. 控制器代码

  • 大文件分片上传

    转载https://mp.weixin.qq.com/s/HAvngRjJAbakRX40GHIx7g[https...

  • SpringBoot文件分片上传

    背景 最近好几个项目在运行过程中客户都提出文件上传大小的限制能否设置的大一些,用户经常需要上传好几个G的资料文件,...

  • 分布式文件上传的思路

    1.问题描述 现在好多应用都不止一台服务器,这就给文件上传带来了麻烦。尤其是对大文件的分片上传,每个分片可能到达不...

网友评论

      本文标题:java文件上传通用(分片)

      本文链接:https://www.haomeiwen.com/subject/okbnvxtx.html