API загрузить Multipartform-данные - PullRequest
0 голосов
/ 15 января 2019

Мой post контроллер сохраняет Carrierwave @post.picture при выполнении запроса ниже postman.

def create
  @post = Post.new(post_params) 
  respond_to do |format|
    if @post.save
       # .... all the json/html responses
    end
  end
end

def post_params   
  params.require(:post).permit(:description, :picture)
end

почтальон params

POST /posts.json
X-User-Email: fg@email.com
X-User-Token: EBNbDysWKEYqURfpDkWo
Accept: application/json
Content-Type: multipart/form-data; boundary=--------------------------329710892316545763789878
undefined:
cache-control: no-cache
Postman-Token: e320b3bf-c5f3-4e40-a149-fd0323881ec0
User-Agent: PostmanRuntime/7.6.0
Host: 192.168.1.104:3000
accept-encoding: gzip, deflate
content-length: 586600
post[picture]=[object Object]post[description]=test
HTTP/1.1 201
status: 201
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Type: application/json; charset=utf-8
Location: http://192.168.1.104:3000/posts/15
ETag: W/"540dd0914ae94bd0214825e73955bbde"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: ad99898b-31db-46e0-8a4d-3fc82dafd1c1
X-Runtime: 128.284019
Transfer-Encoding: chunked
{"id":15,"description":"test","picture": {
    "url":"/uploads/Screenshot_from_2019-01-01_16-10-05.png","thumb":{
         "url":"/uploads/thumb_Screenshot_from_2019-01-01_16-10-05.png"
         },"card":{
         "url":"/uploads/card_Screenshot_from_2019-01-01_16-10-05.png"
         }
    },}

enter image description here

Это параметры rails, полученные с сервера

{"post"=>
  {"picture"=>
     #<ActionDispatch::Http::UploadedFile
        @tempfile=#<Tempfile:/tmp/RackMultipart20190115-10912-1rryjxd.png>,
        @original_filename="Screenshot from 2019-01-01 16-10-05.png", 
        @content_type="image/png", 
        @headers="Content-Disposition: form-data; name=\"post[picture]\"; filename=\"Screenshot from 2019-01-01 16-10-05.png\"\r\nContent-Type: image/png\r\n">,},}

Я передаю через AJAX следующие данные формы

enter image description here

сервер Rails обрабатывает параметры как

{"post"=>{"picture"=> {
  "path"=>"file:///data/user/0/com.surfapp/cache/Camera/9bc15acd-01d2-4539-a930-f129d72c3dcf.jpg", 
  "name"=>"test.png", 
   "type"=>"image/png"
           }
     }
}

1 Ответ

0 голосов
/ 21 января 2019

Я принял следующее решение с парой модификаций:

Я создаю класс Upload::Cache, который наследуется от класса ruby ​​Tempfile, и класс Upload::Image, который наследуется от класса Upload .

Обратный вызов set_picture запускается до того, как отправляет контроллеру действие создания и добавляет изображение к @post до saving.

Спецификация покрытия для этой функции

...