【问题标题】:Customize Shrine gem JSON response自定义 Shrine gem JSON 响应
【发布时间】:2016-12-25 07:02:49
【问题描述】:

我在我的 Rails 应用程序中使用 shrine gem 来上传文件。我想将此 gem 与 fineuploader 前端库集成,以在上传文件时增强用户体验。我能够将它集成到能够通过神社服务器端代码通过fineuploader前端将文件上传到我的s3存储桶的程度。

现在,在成功上传后,我会收到带有 JSON 响应的 200 状态代码,如下所示:

{"id":"4a4191c6c43f54c0a1eb2cf482fb3543.PNG","storage":"cache","metadata":{"filename":"IMG_0105.PNG","size":114333,"mime_type":"image/png","width":640,"height":1136}}

但 Fineuploader 期望 JSON 响应中的 success 属性值为 true,以便认为此响应成功。所以我需要修改这个 200 状态 JSON 响应来插入这个成功属性。为此,我询问了shrine gem 的作者,他建议我在神社初始化文件中使用此代码:

class FineUploaderResponse
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)

    if status == 200
      data = JSON.parse(body[0])
      data["success"] = true
      body[0] = data.to_json
    end

    [status, headers, body]
  end
end

Shrine::UploadEndpoint.use FineUploaderResponse

不幸的是,此代码无法正常工作,实际上使用此代码 Fineuploader 会在控制台中引发以下错误:

Error when attempting to parse xhr response text (Unexpected end of JSON input)

请告诉我,我需要如何修改此代码以插入具有有效 JSON 响应的 success 属性。

【问题讨论】:

  • 你找到解决办法了吗?

标签: ruby-on-rails json amazon-s3 shrine


【解决方案1】:

更改正文后,您需要更新标题内的Content-Length,否则浏览器会将其截断。如果你这样做,它将完美地工作:

class FineUploaderResponse
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)

    if status == 200
      data = JSON.parse(body[0])
      data['success'] = true
      body[0] = data.to_json

      # Now let's update the header with the new Content-Length
      headers['Content-Length'] = body[0].length
    end

    [status, headers, body]
  end
end

Shrine::UploadEndpoint.use FineUploaderResponse

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多