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>