使用 Carrierwave 将原始文件上传到 Rails

发布于 2024-11-16 16:39:55 字数 625 浏览 1 评论 0原文

我的客户正在尝试从黑莓和 Android 手机上传图像。他们不喜欢发布 a) 表单参数或 b) 多部分消息。他们想要做的是仅使用文件中的数据对 url 进行 POST。

类似这样的事情可以在curl中完成: curl -d @google.png http://server/postcards/1/photo.json -X POST

我希望将上传的照片放入明信片模型的照片属性中并放入正确的目录。

我正在控制器中执行类似的操作,但目录中的图像已损坏。我现在正在手动将文件重命名为“png”:

def PostcardsController < ApplicationController
...
# Other RESTful methods
...
def photo
  @postcard = Postcard.find(params[:id])
  @postcard.photo = request.body
  @postcard.save
end

模型:

class Postcard < ActiveRecord::Base
  mount_uploader :photo, PhotoUploader
end

My clients are trying to upload an image from Blackberry and Android phones. They don't like posting a)form parameters or b) multipart messages. What they would like to do is do a POST to a url with only the data from the file.

Something like this can be done in curl:
curl -d @google.png http://server/postcards/1/photo.json -X POST

I'd like the uploaded photo to put into the photo attribute of the postcards model and into the right directory.

I'm doing something like this in the controller but the image is corrupted in the directory. I am doing a manual renaming of the file to a "png" for now:

def PostcardsController < ApplicationController
...
# Other RESTful methods
...
def photo
  @postcard = Postcard.find(params[:id])
  @postcard.photo = request.body
  @postcard.save
end

The model:

class Postcard < ActiveRecord::Base
  mount_uploader :photo, PhotoUploader
end

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

稀香 2024-11-23 16:39:55

这是可以完成的,但您仍然需要客户端发送原始文件名(如果您对类型进行任何验证,则还需要发送内容类型)。

def photo
  tempfile = Tempfile.new("photoupload")
  tempfile.binmode
  tempfile << request.body.read
  tempfile.rewind

  photo_params = params.slice(:filename, :type, :head).merge(:tempfile => tempfile)
  photo = ActionDispatch::Http::UploadedFile.new(photo_params)

  @postcard = Postcard.find(params[:id])
  @postcard.photo = photo

  respond_to do |format|
    if @postcard.save
      format.json { head :ok }
    else
      format.json { render :json => @postcard.errors, :status => :unprocessable_entity }
    end
  end
end

现在您可以使用 And 来设置照片

curl http://server/postcards/1/photo.json?filename=foo.png --data-binary @foo.png

并使用 &type=image/png 指定内容类型。

This can be done but you will still need your clients to send the orignal filename (and the content-type if you do any validation on the type).

def photo
  tempfile = Tempfile.new("photoupload")
  tempfile.binmode
  tempfile << request.body.read
  tempfile.rewind

  photo_params = params.slice(:filename, :type, :head).merge(:tempfile => tempfile)
  photo = ActionDispatch::Http::UploadedFile.new(photo_params)

  @postcard = Postcard.find(params[:id])
  @postcard.photo = photo

  respond_to do |format|
    if @postcard.save
      format.json { head :ok }
    else
      format.json { render :json => @postcard.errors, :status => :unprocessable_entity }
    end
  end
end

And now you can set the photo using

curl http://server/postcards/1/photo.json?filename=foo.png --data-binary @foo.png

And to specify the content-type use &type=image/png.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文