2016-08-18 173 views
1

我在我的rails應用程序中使用shrine gem來進行文件上傳。我想將這個gem與fineuploader前端庫集成,以在上傳文件的同時增強用戶體驗。我可以將它集成到我能夠通過fineuploader前端通過神龕服務器端代碼將文件上傳到我的s3存儲桶。自定義神社寶石JSON響應

現在,在成功上載我收到JSON響應200個狀態碼,出現類似以下內容:

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

但fineuploader預計JSON響應與true值的success屬性,以考慮這個反應成功。所以我需要修改這個200狀態JSON響應來插入這個成功的屬性。對於這一點,我問shrine寶石的作者,他勸我在神社初始化文件中使用此代碼:通過使用此代碼fineuploader

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 

不幸的是,這個代碼不工作,INFACT拋出以下控制檯錯誤:

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

請諮詢我,我該怎麼需要修改這個代碼中插入success財產與一個有效的JSON響應。

+0

您是否找到了解決方案? – Robin

回答

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