【问题标题】:How to download a file from url without saving it to disk?如何从 url 下载文件而不将其保存到磁盘?
【发布时间】:2019-02-28 19:52:41
【问题描述】:

我正在尝试从 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 存储桶而不将其保存到磁盘的方法。我什至不确定这是否是一种更好的方法,但它似乎比将某些内容保存到磁盘更清洁。

我也对其他方法持开放态度。谢谢!

【问题讨论】:

  • 你的文件是不是太大了?
  • 没那么大。它们每个大约 100kb。我看到了 AWS 的分段文件上传功能,但我不会上传大文件。
  • 那么您不需要创建文件、存储为字节并传递给 S3 存储桶。并查看@Vusal 答案。

标签: java amazon-s3


【解决方案1】:

可能,在这种情况下,最好的方法是使用AWS Signed 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()));

【讨论】:

  • 不是 AWS 签名 URL 用于获取 S3 存储桶中的现有文件吗?它还用于上传新文件吗?
  • @ahmetcetin 和上传,请阅读this
  • 我可以使用 AWS 签名 URL 上传文件,但我仍然需要下载它@Vusal。你知道如何将url直接作为文件传递吗?
  • @ahmetcetin 您可以使用 AWS 签名 URL 下载和上传文件。请按照答案和 cmets 中指定的链接进行操作。如果您想在不使用 AWS 签名 URL 的情况下下载它们 - 我也回答了这个问题。从上述链接:Upload an Object Using a Presigned URL (AWS SDK for Java)
  • 谢谢,但不幸的是,这并没有解决我的问题。我仍然需要在我的磁盘中创建文件对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多