如何通过Ruby控制器使用Multipart / form-data?

时间:2019-02-05 19:39:56

标签: ruby ruby-on-rails-3 file-upload controller multipartform-data

我知道我在控制器中收到Content-Typemultipart/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文件。

我首先制作了一个模拟机架环境并对其进行解析

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行并仅获取文件内容。

任何想法都值得赞赏!

1 个答案:

答案 0 :(得分:0)

我实际上意识到了自己的错误。看起来确实是在实际文件数据之上的额外头,但这只是在以ActionDispatch :: Http :: UploadedFile格式发送时才发生。所以,我只需要使用params [:uploaded_data] .tempfile来获取文件:)