2016-08-18 3 views
1

Я использую shrine gem в моем приложении rails для загрузки файлов. Я хочу интегрировать этот камень с библиотекой front-end fineuploader, чтобы улучшить пользовательский интерфейс при загрузке файлов. Я могу интегрировать его в какой-то степени, что я могу загружать файлы через интерфейс fineuploader через связный серверный код в мой s3-ведро.Настроить Shrine gem Ответ JSON

Теперь, при успешной загрузке я получаю код статуса 200 с ответом JSON, который появляется что-то вроде следующего:

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

Но fineuploader ожидает success свойства в ответ JSON со значением true для того, чтобы считать этот ответ успешным. Поэтому мне нужно изменить этот ответ на состояние JSON на 200, чтобы вставить это свойство успеха. Для этого я спросил автор 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 

К сожалению, этот код не работает и Infact с помощью этого кода fineuploader бросает следующее сообщение об ошибке в консоли :

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 
Смежные вопросы