java - 如何从 url 下载文件而不将其保存到磁盘?
问题描述
我正在尝试从 url 下载文件并将它们上传到 AWS 中的 S3 存储桶。到目前为止,我最好的方法是将文件保存到磁盘中的临时文件夹并在将其上传到 S3 存储桶后将其删除。
我就是这样做的:
private File downloadFileFromUrl(String fileUrlToUpload) {
try {
URL url = new URL(fileUrlToUpload);
String tempDir = System.getProperty("java.io.tmpdir");
File file = new File(tempDir + FilenameUtils.getName(url.getPath()));
FileUtils.copyURLToFile(url, file);
return file;
} catch (IOException e) {
LOGGER.error("Could not download file from: {}!", fileUrlToUpload);
return null;
}
}
然后在调用downloadFileFromUrl方法的服务中上传文件后删除文件。
但是,我正在寻找一种从 url 下载文件并将其直接上传到 S3 存储桶而不将其保存到磁盘的方法。我什至不确定这是否是一种更好的方法,但它似乎比将某些内容保存到磁盘更清洁。
我也对其他方法持开放态度。谢谢!
解决方案
在这种情况下,最好的方法可能是使用AWS 签名 URL来上传和下载文件 - 而不是充当代理。
如果您坚持自己下载文件,您可以执行以下操作:
BufferedInputStream bufferedInputStream = new BufferedInputStream(url.openStream());
StringBuilder sb = new StringBuilder();
byte[] buffer = new byte[1024];
while ((buffer = bufferedInputStream.read(buffer)) != -1) {
sb.append(new String(buffer));
}
sb
- 包含文件的内容。
您还可以使用Apache Commons Lang:
IOUtils.toString(new InputStreamReader(url.openStream()));
推荐阅读
- mysql - Laravel make:auth — 如何从 1 个表单发送 2 个查询?例如:通过电子邮件发送到一张桌子并将用户名发送到另一张桌子
- r - R 具有自定义线型的多条线图
- c# - 如何同时在多个浏览器上运行测试?Selenium 网格、C#、Specflow、NUnit
- rust - “&*”在 Rust 中做了什么
- maven - 当我第一次运行versions-maven-plugin时,为什么maven会下载多个版本的依赖项?
- java - Java / Sql-server 参数绑定没有按预期工作
- android - 运行 React-Native 项目的错误
- excel - 由于动态组合框,清除用户表单子给出 1004 错误
- api - 我如何参数化我在 API 请求中传递的参数并通过空手道执行?
- mysql - 无法将 spring-boot 2 服务连接到不同容器中的 mysql