Как использовать Multipart / form-данные через Ruby Controllers? - PullRequest
0 голосов
/ 05 февраля 2019

Я знаю, что получаю файл с 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 и проанализировал его

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'] имеет вторую часть, но я все еще не знаю, как правильно разобрать 4строки, которые включают Content-Disposition, Content-Length, Content-Type, Content-Transfer-Encoding и получают только содержимое файла.

Любые идеи приветствуются!

1 Ответ

0 голосов
/ 13 февраля 2019

Я действительно осознал свою ошибку.Похоже, что это дополнительный заголовок поверх фактических данных файла, но это происходит, когда он отправляется в формате ActionDispatch :: Http :: UploadedFile.Итак, мне просто нужно было использовать params [: uploaded_data] .tempfile, чтобы получить файл:)

...