Java上传文件慢,大文件上传卡顿,请求超时怎么办?
话不多说直接上代码,代码复制过去可以直接使用
第一步:创建后端代码
package cn.leon.demo.rest;import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;/*** 分片上传文件相关接口** @author leon* @date 2021/03/19 17:40:06*/
@Slf4j
@RequestMapping("/chunk-upload")
@RestController
public class UploadFileController {/*** 文件上传路径,配置文件配置或者这里写死也行* ##fileUploadPath* file.upload.path=/Users/leon/Desktop**/@Value("${file.upload.path}")private String fileUploadPath;/*** 分片上传小文件** @param clientId 客户端ID,每个客户端每次上传时生成,保持唯一* @param chunkId 分片ID,从0开始累加,每次上保持传唯一* @param chunks 分片总数* @param file* @return java.lang.String* @author leon* @date 2021/04/07 17:16:59*/@CrossOrigin@PostMapping("/part")public Result bigFile(MultipartFile file, @RequestParam(name = "clientId", required = true) String clientId, @RequestParam(name = "chunks", required = true) Integer chunks, @RequestParam(name = "chunkId", required = true) Integer chunkId) throws Exception {log.info("开始上传分片文件,客户端ID:{},总分片数:{},分片ID:{}", clientId, chunks, chunkId);// 文件存放目录:临时目录用来存放所有分片文件SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");String dateStr = sdf.format(new Date());//临时文件目录String tempFileDir = fileUploadPath + File.separator + dateStr + clientId;File parentFileDir = new File(tempFileDir);if (!parentFileDir.exists()) {parentFileDir.mkdirs();}// 分片处理时,前台会多次调用上传接口,每次都会上传文件的一部分到后台File tempPartFile = new File(parentFileDir, clientId + "_" + chunkId + ".part");FileUtils.copyInputStreamToFile(file.getInputStream(), tempPartFile);log.info("分片文件上传成功,分片ID:{}", chunkId);return "ok";}/*** 上传分片文件完成后合并成一个大文件** @param clientId 客户端ID,每次上传时生成和分片上传时参数保持一致* @param fileName 原文件名* @return java.lang.String 返回最终保存文件路径* @author leon* @date 2021/04/07 17:13:46*/@CrossOrigin@PostMapping("/merge")public String mergeFile(@RequestParam(name = "clientId", required = true) String clientId, @RequestParam(name = "fileName", required = true) String fileName) throws Exception {log.info("开始合并文件,客户端ID:{},文件名:{}", clientId, fileName);// 文件存放目录SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");String dateStr = sdf.format(new Date());//最终文件上传目录String fileSavePath = fileUploadPath + File.separator + dateStr;//临时文件目录String tmpFileSavePath = fileSavePath + clientId;//最终文件上传文件名String newFileName = UUID.randomUUID().toString();if (fileName.indexOf(".") != -1) {newFileName += fileName.substring(fileName.lastIndexOf("."));}//创建父文件夹File parentFileDir = new File(tmpFileSavePath);if (parentFileDir.isDirectory()) {File destNewFile = new File(fileSavePath, newFileName);if (!destNewFile.exists()) {//先得到文件的上级目录,并创建上级目录,再创建文件destNewFile.getParentFile().mkdir();destNewFile.createNewFile();}//遍历"所有分片文件"到"最终文件"中,此处一定要按照顺序合并文件,不然会导致文件合并错乱不可用for (int i=0;i
第二步:创建前端代码测试
分片上传文件测试
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!