【问题标题】:Rails-4 carrierwave not saving uploaded file via ajaxRails-4 carrierwave 未通过 ajax 保存上传的文件
【发布时间】:2014-11-22 20:56:13
【问题描述】:

我正在尝试使用 ajax 上传来使用 Railscarrierwave gem 上传文件。

在 Rails 模型中,如果我注释掉载波上传器,图像将加载

   class Asset < ActiveRecord::Base
     #mount_uploader :attachment, AttachmentUploader                              
   end

这是上面注释掉carrierwave时的上传保存

   Processing by Api::AssetsController#create as JSON
   Parameters: {"asset"=>{"attachment"=>"C:\\fakepath\\wiz.jpg"}}
   (0.1ms)  begin transaction
   SQL (0.3ms)  INSERT INTO "assets" ("attachment", "created_at", "updated_at") 
   VALUES     (?, ?, ?)  [["attachment", "C:\\fakepath\\wiz.jpg"], 
   ["created_at", "2014-11-12 21:19:50.456924"], 
   ["updated_at", "2014-11-12 21:19:50.456924"]]
   (7.8ms)  commit transaction

但是,当我使用carrierwave上传器时,文件在发送到控制器的参数中正确传递,但是,它保存为nil

     started POST "/api/assets.json" for 127.0.0.1 at 2014-11-12 13:27:59 +0000
       Processing by Api::AssetsController#create as JSON
       Parameters: {"asset"=>{"attachment"=>"C:\\fakepath\\wiz.jpg"}}
       (0.1ms)  begin transaction
       SQL (0.3ms)  INSERT INTO "assets" ("attachment", "created_at", "updated_at")
       VALUES (?, ?, ?)  [["attachment", nil],
       ["created_at", "2014-11-12 13:27:59.814416"],    
       ["updated_at", "2014-11-12 13:27:59.814416"]]
       (7.0ms)  commit transaction

请求头有多个部分

Remote Address:127.0.0.1:4200
Request URL:http://localhost:4200/api/assets.json
Request Method:POST
Status Code:200 OK

Accept:*/*
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryX8gWNEUkD4hyVsxz

请求负载如下所示:

   ------WebKitFormBoundaryX8gWNEUkD4hyVsxz
   Content-Disposition: form-data; name="asset[attachment]"

   C:\fakepath\wiz.jpg
   ------WebKitFormBoundaryX8gWNEUkD4hyVsxz--

Rails 控制器

    class Api::AssetsController < ApplicationController
       def create
         @asset = Asset.new(asset_params)
         @asset.attachment = params[:asset][:attachment]
         if @asset.save
           render json: @asset, status: :ok
         end
        end

        private

       def asset_params
         params.require(:asset).permit(:attachment)                     
       end
    end

【问题讨论】:

  • 你能把你的上传文件和表单和你的模型一起添加吗

标签: ruby-on-rails-4 file-upload ember.js carrierwave


【解决方案1】:

老实说,我发现carrierwave 遇到的麻烦比它的价值要大,因为从文件首次上传与检索已经上传的文件时出现的模型状态属性不一致。卷积和彻头彻尾的复杂性令人难以置信。

我建议只关注rails guide on uploading files。 rails 控制器非常简单,您可以完全控制您想要做什么,按照队列进行后台处理......无论您想要什么。它既漂亮又干净,可以根据需要轻松简单地进行更改。和你一样,我使用 Ember 和 ajax 将文件作为多部分表单数据发送,它可以工作。

IMO 很多这样的宝石比它们的价值更麻烦,因为它们将不同的问题混为一谈,最终把它弄得一团糟。我看不到他们提供的附加值。

如果您想发布处理图像,只需使用您选择的图像处理库(ruby vips 很快),如果您想处理 CSV 文件,只需执行您需要的操作。不需要复杂的变体处理和匹配具有一些讨厌的排序边缘情况的垃圾。

如果您真的必须使用carrierwave uploader gem,那么很抱歉我可能没有回答您的问题,但也许我已经让您考虑到您认为您从中获得了什么真正的价值..

【讨论】:

    【解决方案2】:

    我决定不使用 HTML-5 form-data 来发送表单,而是使用 jquery-file-upload 插件。通过这种更改,carrierwave 可以检测到文件上传。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-05
      • 2013-11-20
      • 2016-12-22
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      相关资源
      最近更新 更多