附件用的fastdf上传和下载的, 本地开发时就没考虑过多文件上传就会有并发的问题,比如多个只上传成功了一个或者上传了但是文档内容缺失了,变成0字节。
呵。。都是一次难忘的经历。
经过本地模拟大批量的上传下载, 发现fastdf是在启动时就初始化了tracker和stroge, 每次调用过他的接口后都会关闭连接, 这样就导致上传的不完整或者不成功。也是后面找的博客看到的,非常感谢这篇文章。https://blog.csdn.net/AFSGEFEGH/article/details/109034532?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3-109034532-blog-114929991.235^v27^pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3-109034532-blog-114929991.235^v27^pc_relevant_multi_platform_whitelistv3&utm_relevant_index=6
记得方法上面加上synchronized
点击查看代码- @RequestMapping(value = "/batchDownloadForThesisCheck2", method = RequestMethod.POST)
- public synchronized void batchDownloadForThesisCheck2(@RequestBody List<FileInfoDto> fileInfoList) {
- if(CollectionUtils.isEmpty(fileInfoList)){
- throw new EducationException("下载附件失败");
- }
- List<FileInfoDto> fileInfoDtos = differentFileName(fileInfoList);
- // List<FileInfoDto> fileInfoDtos = new ArrayList<>();
- // for(int fi=0;fi<300;fi++){
- // FileInfoDto it = new FileInfoDto();
- // it.setFileName("20210115_小鱼儿"+fi+"_jjlw.doc");
- // fileInfoDtos.add(it);
- // }
- String zipName = request.getParameter("zipName");
- if(StringUtils.isEmpty(zipName)) zipName = "批量下载";
- ZipOutputStream zipOS = null ;
- InputStream is = null;
- OutputStream os = null;
- // 计算百分值
- int index =1;
- int totalSize =CollectionUtils.isNotEmpty(fileInfoDtos) ? fileInfoDtos.size():1;
- try {
- response.setContentType("application/octet-stream; charset=UTF-8");
- response.setHeader("Access-Control-Expose-Headers", "fileName");
- response.setHeader("fileName", URLEncoder.encode(zipName, "UTF-8"));
- os = response.getOutputStream();
- zipOS = new ZipOutputStream(os);
- for (FileInfoDto info : fileInfoDtos) {
- // 机检论文换名字,学号_姓名_jjlw命名
- String itemFileName= info.getFileName();
- // itemFileName = "S20020804005_陈明鑫_jjlw .docx";
- int secondShowIndex = Common.findNumber(itemFileName,"_",2);
- int firstShowIndex = Common.findNumber(itemFileName,"_",1);
- if("1".equals(info.getPaperToName())){
- // 文件格式1:学校代码_学号_LW.doc 2:学号_姓名_jjlw
- itemFileName = "10356_"+itemFileName.substring(0,firstShowIndex)+"_LW"+itemFileName.substring(itemFileName.lastIndexOf("."),itemFileName.length());
- }else{
- itemFileName = itemFileName.substring(0,secondShowIndex)+"_jjlw"+itemFileName.substring(itemFileName.lastIndexOf("."),itemFileName.length());
- }
- logger.error("已下载学生:{} " ,itemFileName);
- zipOS.putNextEntry(new ZipEntry(itemFileName));
- try{
- is = fastDFS.downloadFile(info.getFileId());
- // is = fastDFS.downloadFile("group1/M00/00/C0/wKgjdWQYEJ-AbefsAdOyZXrKanw028.doc");
- int len = 0;
- byte[] buffer = new byte[1024*8];
- while ((len = is.read(buffer)) != -1) {
- zipOS.write(buffer, 0, len);
- }
- // is.close();
- // 计算进度,向下取整
- double nowProcess = Math.floor((index*100)/totalSize);
- logger.error("已下载”{}",index);
- // createProcessDownFile(nowProcess,"已下载"+nowProcess+"%",info.getTimeId(),info.getUserId());
- index ++;
- }catch(Exception ignored){
- }
- zipOS.flush();
- // zipOS.closeEntry();
- }
- } catch (IOException e) {
- // createProcessDownFile(100d,"批量下载发生错误",fileInfoList.get(0).getTimeId(),fileInfoList.get(0).getUserId());
- logger.error("批量下载发生错误: " + e.getMessage(), e);
- } finally {
- try {
- if (zipOS != null) {
- zipOS.closeEntry();
- zipOS.close();
- }
- if (os != null) os.close();
- // createProcessDownFile(100d,"已下载100%",fileInfoList.get(0).getTimeId(),fileInfoList.get(0).getUserId());
- logger.warn("关闭机检下载 :" );
- } catch (IOException e) {
- // createProcessDownFile(100d,"批量下载发生错误,关闭文件流失败",fileInfoList.get(0).getTimeId(),fileInfoList.get(0).getUserId());
- logger.warn("关闭文件流失败, cause by :" + e.getMessage());
- }
- // finally {
- // createProcessDownFile(100d,"已下载100%",fileInfoList.get(0).getTimeId(),fileInfoList.get(0).getUserId());
- // logger.warn("关闭机检下载 :" );
- // }
- }
- }
复制代码 fastdf源码中storageServer每次用完都会关闭

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |