服务端大文件处理DEMO

public class FileSplit {
    public static void main(String[] args) throws Exception {
        // 准备一个大文件,放在指定目录下
        FileInputStream fis = new FileInputStream("xxx.xx");
        // 10M
        byte[] bytes = new byte[1024 * 1024 * 10];
        int i = 0;
        while (fis.read(bytes) != -1) {
            FileOutputStream fos = new FileOutputStream(i++ + ".blob");
            fos.write(bytes);
            fos.flush();
            fos.close();
        }
        fis.close();
    }
}

@SpringBootApplication
@RestController
public class FileServer {
    public static void main(String[] args) {
        SpringApplication.run(FileServer.class);
    }

    @CrossOrigin
    @GetMapping("/data/{fileName}")
    public void download(@PathVariable("fileName") String fileName, HttpServletResponse response) throws Exception {
        // 按照指定文件的目录进行读取
        FileInputStream fis = new FileInputStream(fileName + ".blob");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".blob");
        response.setContentType("application/octet-stream");
        ServletOutputStream outputStream = response.getOutputStream();
        byte[] buffer = new byte[1024 * 10];
        while (fis.read(buffer) != -1) {
            outputStream.write(buffer);
            // 观察效果
            Thread.sleep(1000);
        }
        fis.close();
        outputStream.flush();
        outputStream.close();
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Blob</title>
</head>
<body>

</body>
<script>
    // 假设你有一个文件URL数组
    const fileUrls = ['http://localhost:8080/data/0',
        'http://localhost:8080/data/1',
        'http://localhost:8080/data/2',
        'http://localhost:8080/data/3',
        'http://localhost:8080/data/4',
        'http://localhost:8080/data/5',
        'http://localhost:8080/data/6',
        'http://localhost:8080/data/7',
        'http://localhost:8080/data/8',
        'http://localhost:8080/data/9',
    ];

    async function downloadAndMergeChunks(urls) {
        let chunks = [];

        // 串行下载所有分片
        for (let url of urls) {
            const response = await fetch(url);
            if (!response.ok) {
                throw new Error(`HTTP error! status: ${response.status}`);
            }
            chunks.push(await response.blob());
        }

        // 合并分片
        const mergedBlob = new Blob(chunks);

        // 处理合并后的Blob,例如创建一个下载链接
        const url = URL.createObjectURL(mergedBlob);
        const a = document.createElement('a');
        a.href = url;
        a.download = 'merged_file.doc'; // 替换为你的文件名和扩展名
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
    }

    downloadAndMergeChunks(fileUrls).catch(error => console.error('Error downloading and merging chunks:', error));

    console.log("非阻塞");
</script>
</html>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值