如何通过 Ruby 控制器消费 Multipart/form-data?
How to consume Multipart/form-data via Ruby Controllers?
我知道我在我的控制器中收到一个带有 Content-Type
: multipart/form-data
的文件,我知道该文件是用这样的东西上传的:
body[:uploaded_data] = Faraday::UploadIO.new(path, mime_type, hash[:filename])
而我收到的文件内容是这样的
-------------RubyMultipartPost
Content-Disposition: form-data; name="filename"
1_BsKbDTA9ZUVroeJ7asId4Q.png
-------------RubyMultipartPost
Content-Disposition: form-data; name="uploaded_data"; filename="RackMultipart20190205-12268-1eli4dv"
Content-Length: 34441
Content-Type: image/png
Content-Transfer-Encoding: binary
‰PNG
IHDR
awùé¨gP\ÆñÇèŒÎÌ_ý....
我正在尝试对其进行解析,以便只获取 png
文件的内容并将其另存为实际的 png
文件。
我首先制作了一个模拟 Rack 环境并解析它
env = Rack::MockRequest.env_for(
'/',
'CONTENT_TYPE' => request.headers['Content-Type'],
'CONTENT_LENGTH' => request.body.length,
'rack.input' => StringIO.new(request.body.read),
)
parsed_message = Rack::Multipart.parse_multipart(env)
我知道 parsed_message['uploaded_data']
有第二部分,但我仍然不知道如何正确解析包含 Content-Disposition, Content-Length, Content-Type, Content-Transfer-Encoding
的 4 行并仅获取文件内容。
欢迎任何想法!
我真的意识到了我的错误。它看起来确实像是实际文件数据之上的额外 header,但只有当它以 ActionDispatch::Http::UploadedFile 格式发送时才会发生这种情况。所以,我只需要使用 params[:uploaded_data].tempfile 来获取文件 :)
我知道我在我的控制器中收到一个带有 Content-Type
: multipart/form-data
的文件,我知道该文件是用这样的东西上传的:
body[:uploaded_data] = Faraday::UploadIO.new(path, mime_type, hash[:filename])
而我收到的文件内容是这样的
-------------RubyMultipartPost
Content-Disposition: form-data; name="filename"
1_BsKbDTA9ZUVroeJ7asId4Q.png
-------------RubyMultipartPost
Content-Disposition: form-data; name="uploaded_data"; filename="RackMultipart20190205-12268-1eli4dv"
Content-Length: 34441
Content-Type: image/png
Content-Transfer-Encoding: binary
‰PNG
IHDR
awùé¨gP\ÆñÇèŒÎÌ_ý....
我正在尝试对其进行解析,以便只获取 png
文件的内容并将其另存为实际的 png
文件。
我首先制作了一个模拟 Rack 环境并解析它
env = Rack::MockRequest.env_for(
'/',
'CONTENT_TYPE' => request.headers['Content-Type'],
'CONTENT_LENGTH' => request.body.length,
'rack.input' => StringIO.new(request.body.read),
)
parsed_message = Rack::Multipart.parse_multipart(env)
我知道 parsed_message['uploaded_data']
有第二部分,但我仍然不知道如何正确解析包含 Content-Disposition, Content-Length, Content-Type, Content-Transfer-Encoding
的 4 行并仅获取文件内容。
欢迎任何想法!
我真的意识到了我的错误。它看起来确实像是实际文件数据之上的额外 header,但只有当它以 ActionDispatch::Http::UploadedFile 格式发送时才会发生这种情况。所以,我只需要使用 params[:uploaded_data].tempfile 来获取文件 :)