【SpringMVC(十六)】分片上传 例子

32 篇文章 15 订阅
30 篇文章 5 订阅

对于大文件的上传,客户端可以多线程分片上传,加快速率,服务端需要merge分片并存储。

常见思路:

通过status预上传接口获取一个key,再调用分片接口上传每一个分片,上传完调用publish接口完成上传。status接口的key用于串联整个过程。

一个简单的示例:

@RestController
@RequestMapping("/rest/n/testApi")
public class UploadController {

    private ArrayListMultimap<String, byte[]> partsCache = ArrayListMultimap.create();

    @Value("${upload.path}")
    private String uploadPath;

    @RequestMapping("/status")
    public Object status() {
        return fileKey();
    }

    @RequestMapping("/part")
    public Object part(@RequestParam String fileKey,
                       @RequestParam int index,
                       @RequestParam MultipartFile data) throws IOException {
        partsCache.get(fileKey).add(index, data.getBytes());
        return "ok";
    }

    @RequestMapping("/upload")
    public Object upload(@RequestParam String fileKey, @RequestParam String fileName) throws IOException {

        try(ByteArrayOutputStream out = new ByteArrayOutputStream()) {
            partsCache.get(fileKey).forEach(part -> {
                try {
                    out.write(part);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            Path realPath = Paths.get(uploadPath + '/' + fileName);
            if (!Files.exists(realPath)) {
                Files.createDirectories(realPath.getParent());
                Files.createFile(realPath);
            }
            Files.write(realPath, out.toByteArray());
        }

        return "ok";
    }

}

public class FileUploadUtil {

    public static String fileKey() {
        return "" + System.currentTimeMillis();
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值