1. 程式人生 > 其它 >斷點續傳(上傳)Java版

斷點續傳(上傳)Java版

PostMan 客戶端呼叫部分見,斷點續傳(上傳)C#版

1.客戶每次上傳前先獲取一下當前檔案已經被伺服器接受了多少

2.上傳時設定偏移量,跳過伺服器已收到的長度

@SpringBootTest
public class FileTests {

    @Test
    void seekTest() {
        try {
            RandomAccessFile writeFile = new RandomAccessFile("D:\\temp\\1.txt", "rw");
            writeFile.seek(2);
            writeFile.write(
"-VipSoft-".getBytes()); } catch (Exception ex) { ex.printStackTrace(); } } }
package com.vipsoft.api;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.vipsoft.api.base.util.ApiResult;
import com.vipsoft.api.base.util.BuinessCodeEnum;
import com.vipsoft.api.base.util.PojoUtil; import com.vipsoft.api.base.vo.UploadFileModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; /** * 斷點續傳 */ @Api(tags = "斷點續傳介面") @RestController @RequestMapping("/upload") public class UploadController { private Logger logger = LoggerFactory.getLogger(this.getClass()); String savePath = "D:\\temp\\UpdateSystem"; //TODO 配置檔案 /** * 獲取已上傳檔案大小 * @param request * @param param * @return */ @ApiOperation(value = "獲取已上傳檔案大小", notes = "") @PostMapping("/getFileLength") public ApiResult getFileLength(HttpServletRequest request, @RequestBody UploadFileModel param) { //判斷入參是否為空 ApiResult result = new ApiResult(); try { String fileName = ""; if (param != null) { fileName = param.getFileName(); } if (StrUtil.isEmpty(fileName)) { //實體沒有就從Header 裡面取 fileName = request.getHeader("FileName"); } if (StrUtil.isEmpty(fileName)) { result.setBussinessCode(6001); ; result.setBussinessMsg("FileName 檔名不能為空"); result.setBussinessData(0); return result; } //設定檔案存放路徑 //string dir = HttpContext.Current.Server.MapPath(SavePath); fileName = savePath + "\\" + fileName; String msg = ""; if (FileUtil.exist(fileName)) { File file = new File(fileName); result.setBussinessData(file.length()); msg = StrUtil.indexedFormat("FileName => {0} Length => {1}", fileName, file.length()); } else { result.setBussinessData(0); msg = StrUtil.indexedFormat("檔案不存在 FileName => {0} Length => 0", fileName); } result.setBussinessMsg("獲取成功!"); result.setBussinessCode(0); msg = StrUtil.indexedFormat("檔案不存在 FileName => {0} Length => 0", fileName); logger.info("獲取檔案長度 => {}", msg); } catch (Exception ex) { logger.error(PojoUtil.pojoToJson(param)); logger.error(ex.getMessage(), ex); result.setBussinessCode(BuinessCodeEnum.ERROR.getCode()); result.setBussinessMsg(ex.getMessage()); } return result; } /** * 上傳檔案 * @param request * @return */ @ApiOperation(value = "獲取已上傳檔案大小", notes = "") @PostMapping("/uploadFile") public ApiResult uploadFile(HttpServletRequest request, @RequestParam(value = "File") MultipartFile file) { //判斷入參是否為空 ApiResult result = new ApiResult(); String fileName = ""; try { fileName = request.getParameter("FileName"); long offset = 0; String offsetStr = request.getHeader("Offset"); if (StrUtil.isEmpty(offsetStr)) { offsetStr = request.getParameter("Offset"); } if (StrUtil.isNotEmpty(offsetStr)) { offset = Long.valueOf(offsetStr); } if (StrUtil.isEmpty(fileName)) { logger.error("FileName 上傳檔名不能為空"); result.setBussinessCode(6002); result.setBussinessMsg("FileName 上傳檔名不能為空"); result.setBussinessData(false); return result; } File dir = new File(savePath); //如果不存在資料夾,就建立資料夾 if (!dir.exists()) { dir.mkdir(); } String saveFileName = savePath + "\\" + fileName; RandomAccessFile writeFile = new RandomAccessFile(saveFileName, "rw"); writeFile.seek(offset); String ss = file.getName(); long upLoadLength = file.getSize(); writeFile.write(file.getBytes()); result.setBussinessCode(0); result.setBussinessMsg("上傳成功!"); result.setBussinessData(true); logger.info("上傳檔案 {} Offset => {} File.ContentLength => {} => {}", fileName, offset, upLoadLength, saveFileName); } catch (IOException e) { result.setBussinessCode(6003); result.setBussinessMsg(e.getMessage()); result.setBussinessData(false); logger.error(e.getMessage() + " => " + fileName, e); } return result; } }
public class UploadFileModel implements Serializable {

    @JsonProperty("FileName")
    private String fileName;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
}