Aws::S3::Errors::BadDigest 尝试存储临时文件时

Aws::S3::Errors::BadDigest while trying to store a Tempfile

我有以下片段:

tempfile = Tempfile.new(export_file.filename)
begin
  tempfile.write(contents)
  file_storage_service.store(export_file.filename, tempfile)
ensure
  tempfile.close!
end

store方法如下:

def store(filename, file)
  client = Aws::S3::Client.new(options)
  object = Aws::S3::Object.new(bucket_name, filename, client: client)
  object.upload_file(file)
end

我的问题是,我似乎在我的一台云计算机上遇到 Aws::S3::Errors::BadDigest 错误,但是 本地 这按预期工作。

我相信在调用 store 方法时临时文件未链接,导致 AWS 比较两个不同的摘要,但我对此不太确定。我在两台机器上都有 Ruby 2.1.6,本地一台 运行 OS X 和云一台 Linux.

我该怎么做才能解决这个问题?问题的原因是什么?

P.S.: 我在临时文件上尝试了 close!close,结果相同。

S3 的 upload_file 似乎需要一个光标已重置的文件。在调用 store 之前调用 tempfile.rewind 可解决此问题。

好的伙计们,我的问题更深了。使用 tempfile.rewind 错误消失了,但是直接对文件所做的更改没有反映在内存中,所以我没有使用倒带,而是最终使用:

tempfile.close
tempfile.open

完全解决了我的问题!