gpt4 book ai didi

ruby-on-rails - 为什么使用 OpenURI 下载文件会导致部分文件?

转载 作者:数据小太阳 更新时间:2023-10-29 07:25:16 24 4
gpt4 key购买 nike

我正在尝试使用 OpenURI 从 S3 下载文件,然后将其保存在本地,以便我可以使用 ActionMailer 将文件作为附件发送。

有些奇怪的事情正在发生。正在下载和附加的图像已损坏,图像的底部丢失。

代码如下:

require 'open-uri'
open("#{Rails.root.to_s}/tmp/#{a.attachment_file_name}", "wb") do |file|
source_url = a.authenticated_url()
io = open(URI.parse(source_url).to_s)
file << io.read
attachments[a.attachment_file_name] = File.read("#{Rails.root.to_s}/tmp/#{a.attachment_file_name}")
end

a 是来自 ActionMailer 的附件。

接下来我可以尝试什么?

最佳答案

看起来您正在尝试在文件关闭之前读取该文件,这可能会使部分文件缓冲区未写入。

我会这样做:

require 'open-uri'

source_url = a.authenticated_url()
attachment_file = "#{Rails.root.to_s}/tmp/#{a.attachment_file_name}"
open(attachment_file, "wb") do |file|
file.print open(source_url, &:read)
end

attachments[a.attachment_file_name] = File.read(attachment_file)

看起来 source_url = a.authenticated_url() 将是一个字符串,因此将字符串解析为 URI 然后对其执行 to_s 将是多余的,除非 URI 是做一些标准化,我认为它不会。

根据我的系统管理员经验:一项附带任务是清理下载/假脱机文件。它们可以在附加后立即删除,或者您可以有一个每天运行的 cron 作业,删除超过一天的所有假脱机文件。

另外一个问题是,在无法读取 URL 导致附件失败的情况下,没有错误处理。使用临时假脱机文件,您可以检查该文件是否存在。更好的是,如果服务器返回 400 或 500 错误,您可能应该准备好处理异常。


为避免使用临时假脱机文件,请尝试以下未经测试的代码:

require 'open-uri'

source_url = a.authenticated_url()
attachments[a.attachment_file_name] = open(source_url, &:read)

关于ruby-on-rails - 为什么使用 OpenURI 下载文件会导致部分文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4362040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com