首页 > 解决方案 > 创建临时文件以上传到 S3

问题描述

我正在编写一个使用 Postgres 表并将表上传到 S3 的 cron 作业。

我打算做以下事情:

  1. 将表转换为 csv 并存储在磁盘上。

  2. 使用 multipart put 从磁盘获取文件并存储在 s3 中。

  3. 从磁盘中删除文件。

问题:

  1. 我应该将文件复制到磁盘吗?上传文件后,有什么方法可以临时复制到磁盘而不显式删除文件?

  2. 在内存中这样做更有意义吗?Postgres 只复制出对 OutputStream 的写入。AFAIK 无法将输出流上传到 S3。

标签: postgresqlamazon-web-servicesamazon-s3

解决方案


所有这些可以在内存中完成,假设您的表有足够的内存,或者只读取和上传表的片段。

如果您使用 Python,则 S3 的 MultipartUpload 文档说它允许bytes每个MultipartUploadPart的文件。这对于其他语言应该是类似的。这样您就可以读取整个表或段,将其转换为类似 csv 的字符串,将它们转换为bytes然后运行 ​​MultipartUpload。此处不需要磁盘上的文件。

如果您使用 Java,则可以使用 InputStreams 作为上传源。要将您的 OutputStream 转换为 InputStream ,请查看此答案

AmazonS3 s3 = new AmazonS3Client(new BasicAWSCredentials("accessKey","secretKey"));
s3.putObject(new PutObjectRequest("mybucket", "myfile", inputStream));

但是,如果您只需要备份您的表,那么我建议使用pg_dump并将生成的文件上传到 S3。


推荐阅读