自定义Shrine gem JSON响应

时间:2016-08-18 11:08:47

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

我在我的rails应用中使用shrine gem进行文件上传。我想将此gem与fineuploader前端库集成,以在上传文件时增强用户体验。我能够将它集成到我能够通过精美加载器前端通过shrine服务器端代码将文件上传到我的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的作者,他建议我在shrine初始化文件中使用这段代码:

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属性。

1 个答案:

答案 0 :(得分:2)

更改正文后,您需要更新标题中的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