dromara / x-file-storage

一行代码将文件存储到 本地、FTP、SFTP、WebDAV、谷歌云存储、阿里云OSS、华为云OBS、七牛云Kodo、腾讯云COS、百度云 BOS、又拍云USS、MinIO、 AWS S3、FastDFS、 Azure Blob Storage、金山云 KS3、美团云 MSS、京东云 OSS、天翼云 OOS、移动云 EOS、沃云 OSS、 网易数帆 NOS、Ucloud US3、青云 QingStor、平安云 OBS、首云 OSS、IBM COS、其它兼容 S3 协议的平台。后续即将支持 Samba、NFS
https://x-file-storage.xuyanwu.cn/
Apache License 2.0
1.77k stars 267 forks source link

大文件下载卡主不动 #238

Closed strongyc closed 7 months ago

strongyc commented 7 months ago

下载小文件可以下载,下载超过600M文件浏览器直接卡主,使用原生minio下载则无此问题,这是怎么回事呢 // response.setHeader("Access-Control-Allow-Origin", "*"); // response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileInfo.getOriginalFilename(), "UTF-8")); // response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); // response.setContentType(fileInfo.getObjectType()); // response.setCharacterEncoding("UTF-8"); // byte[] bytes = fileStorageService.download(fileInfo).bytes(); // IoUtil.write(response.getOutputStream(), true, bytes);

1171736840 commented 7 months ago

打断点看看吧,我没遇到过,话说minio应该提供了访问url,直接根据url下载就好了

1171736840 commented 7 months ago

你这个代码是将文件输出到 response 中,也可能是中间的代理,如Nginx或其它什么对大小做了限制也说不准,你可以尝试将文件直接下载到本地,看看能不能正常下载

1171736840 commented 7 months ago
byte[] bytes = fileStorageService.download(fileInfo).bytes();
IoUtil.write(response.getOutputStream(), true, bytes);

还有你的这两行代码,会将整个文件下载到内存中,再输出到 response ,也可能是你的内存不足

strongyc commented 7 months ago
byte[] bytes = fileStorageService.download(fileInfo).bytes();
IoUtil.write(response.getOutputStream(), true, bytes);

还有你的这两行代码,会将整个文件下载到内存中,再输出到 response ,也可能是你的内存不足

有什么好的办法可以解决吗?

1171736840 commented 7 months ago
byte[] bytes = fileStorageService.download(fileInfo).bytes();
IoUtil.write(response.getOutputStream(), true, bytes);

还有你的这两行代码,会将整个文件下载到内存中,再输出到 response ,也可能是你的内存不足

有什么好的办法可以解决吗?

改成这样

try (ServletOutputStream out = response.getOutputStream()) {
    fileStorageService.download(fileInfo).outputStream(out);
} catch (IOException e) {
    throw new RuntimeException(e);
}
strongyc commented 7 months ago
byte[] bytes = fileStorageService.download(fileInfo).bytes();
IoUtil.write(response.getOutputStream(), true, bytes);

还有你的这两行代码,会将整个文件下载到内存中,再输出到 response ,也可能是你的内存不足

有什么好的办法可以解决吗?

改成这样

fileStorageService.download(fileInfo).outputStream(response.getOutputStream());

这个下载需要手动关闭文件流嘛?还是框架会自动处理?感谢解答

1171736840 commented 7 months ago
byte[] bytes = fileStorageService.download(fileInfo).bytes();
IoUtil.write(response.getOutputStream(), true, bytes);

还有你的这两行代码,会将整个文件下载到内存中,再输出到 response ,也可能是你的内存不足

有什么好的办法可以解决吗?

改成这样

fileStorageService.download(fileInfo).outputStream(response.getOutputStream());

这个下载需要手动关闭文件流嘛?还是框架会自动处理?感谢解答

改成这样

try (ServletOutputStream out = response.getOutputStream()) {
    fileStorageService.download(fileInfo).outputStream(out);
} catch (IOException e) {
    throw new RuntimeException(e);
}
strongyc commented 7 months ago
byte[] bytes = fileStorageService.download(fileInfo).bytes();
IoUtil.write(response.getOutputStream(), true, bytes);

还有你的这两行代码,会将整个文件下载到内存中,再输出到 response ,也可能是你的内存不足

有什么好的办法可以解决吗?

改成这样

fileStorageService.download(fileInfo).outputStream(response.getOutputStream());

这个下载需要手动关闭文件流嘛?还是框架会自动处理?感谢解答

改成这样

try (ServletOutputStream out = response.getOutputStream()) {
    fileStorageService.download(fileInfo).outputStream(out);
} catch (IOException e) {
    throw new RuntimeException(e);
}

感谢,我尝试下~

strongyc commented 7 months ago
byte[] bytes = fileStorageService.download(fileInfo).bytes();
IoUtil.write(response.getOutputStream(), true, bytes);

还有你的这两行代码,会将整个文件下载到内存中,再输出到 response ,也可能是你的内存不足

有什么好的办法可以解决吗?

改成这样

fileStorageService.download(fileInfo).outputStream(response.getOutputStream());

这个下载需要手动关闭文件流嘛?还是框架会自动处理?感谢解答

改成这样

try (ServletOutputStream out = response.getOutputStream()) {
    fileStorageService.download(fileInfo).outputStream(out);
} catch (IOException e) {
    throw new RuntimeException(e);
}

感谢,我尝试下~

感谢,现在下载正常了呢~