1

shrine在我的 Rails 应用程序中使用 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 期望successJSON 响应中的属性值为。true所以我需要修改这个 200 状态 JSON 响应来插入这个成功属性。为此,我询问了shrinegem 的作者,他建议我在神社初始化文件中使用此代码:

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)

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

4

1 回答 1

3

更改正文后,您需要更新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
于 2016-08-18T22:23:33.730 回答