我有一个控制器方法,在表单提交时调用。然后,此方法调用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
@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>>
}
注意:表单中的其他参数也是显示的参数的一部分,但我已将其删除以便于阅读。
此外,我想知道如何检索文件,以便显示并可以下载。