如何在转发用户提交文件时保留原始文件名?
问题解决:转发文件时保留原始文件名
问题原因
直接传递File.open(file.tempfile)时,HTTParty会读取临时文件的系统文件名作为上传文件名,而非我们需要的original_filename。此外手动设置Content-Type: multipart/form-data可能导致请求边界处理异常,干扰正确的文件上传格式。
解决方案
修改HTTParty请求的body参数,显式指定文件名、文件流和内容类型,同时移除手动设置的multipart/form-data头(HTTParty会自动处理):
params[:files].each do |file| HTTParty.post( "https://example.com/files", headers: { "Accept" => "application/json" }, body: { "file" => [file.tempfile, file.original_filename, file.content_type] } ) end
可选写法(哈希格式)
如果更偏好哈希结构,也可以这样写:
params[:files].each do |file| HTTParty.post( "https://example.com/files", headers: { "Accept" => "application/json" }, body: { "file" => { io: file.tempfile, filename: file.original_filename, content_type: file.content_type } } ) end
关键说明
- 数组格式
[io, filename, content_type]和哈希格式{io: ..., filename: ..., content_type: ...}都是HTTParty支持的文件上传参数格式,会正确将原始文件名和内容类型带入请求。 - 移除手动设置的
Content-Type头,避免HTTParty自动生成的请求边界和手动设置的头冲突,确保multipart请求格式正确。
内容的提问来源于stack exchange,提问作者Cjoerg
相关产品推荐
相关产品推荐

