使用Rails 5 API将文件上传到S3

时间:2016-11-02 09:10:44

标签: ruby-on-rails amazon-s3

我有一个控制器方法,在表单提交时调用。然后,此方法调用api来保存包含文件的数据。 如果我在调用api之前在我的控制器方法中执行文件上传代码,则文件会在s3上传,而如果我尝试在api中上传文件,则会在控制器方法中抛出错误。

实施例: 这有效:

def formsubmitmethod
# Code for uploading a file to s3
Aws.config.update(
region: 'region_name',
credentials: Aws::Credentials.new('access_key_id','secret_access_key')
)
s3 = Aws::S3::Resource.new(region: 'region_name')
original_filename = params['picture'].original_filename
obj = s3.bucket('bucket_name').object(original_filename)

File.open(original_filename, 'wb') do |file|
obj.put(body: params['picture'])
end

用于调用需要保存数据的api的代码。

@response = HTTParty.post("url_for_post_request_api", :body => { :query => params.to_json})
end

但是如果我在post_request_api(url_for_post_request_api)的方法中添加相同的代码,则会抛出以下错误:

Encoding::UndefinedConversionError in controller method
"\x89" from ASCII-8BIT to UTF-8
Stack trace of parameters:
Parameters:
{"picture"=>
#<ActionDispatch::Http::UploadedFile:0x007f60b6559498
@content_type="image/png",
@headers="Content-Disposition: form-data; name=\"picture\"; filename=\"1.png\"\r\nContent-Type: image/png\r\n",
@original_filename="1.png",
@tempfile=#<File:/tmp/RackMultipart20161102-10689-137nvix.png>>
}

注意:表单中的其他参数也是显示的参数的一部分,但我已将其删除以便于阅读。

此外,我想知道如何检索文件,以便显示并可以下载。

0 个答案:

没有答案