2017-01-07 10 views
0

У меня есть следующие действия загрузки в мой контроллер ресурсов:send_data возвращения поврежденных файлов

def download 
    require 'open-uri' 

    if validate_token(safe_params[:x]) 
     resource = Resource.find_by_token(safe_params[:x]) 
     data = open(resource.file.url) 

     send_data(data, :disposition => 'attachment',:url_based_filename => true, type: data.meta['content-type'].to_s) 
     # send_file data, disposition: 'attachment' 
     # redirect_to resource.file.url 
     puts data.hash 
     puts data.meta['x-goog-hash'] 
    else 
     redirect_to pages_error_path, notice: 'Does not match resource.' 

    end 
end 

Действие загружает файл, хранящийся на Google Storage (используя carrierwave), а затем потоки этот файл в браузере. Я пробовал несколько разных конфигураций параметров send_data, и я также пробовал send_file. Самое близкое, что я пришел к рабочему решению, - это то, где загружается файл PDF, но он поврежден. (Иногда он случайно загружает текстовый документ, и вместо ожидаемого содержимого файла я получаю объект памяти файла, как показано ниже.

#<File:0x007fcdda128ea0> 

У меня есть чувство, что же происходит с PDF загрузки, за исключением того, что Средство просмотра PDF, очевидно, не может отобразить этот PDF.

Я убедился, что URL-адрес, хранящийся в базе данных, указывает на правильный файл, и переменная data инициализирована правильно. Все работает так, как ожидалось, до момента, когда данные отправляются на браузер

Причина, по которой я делаю это, а не перенаправляю чение к телевизору файл URL, потому что я не хочу, чтобы выставить местоположение файла на хранилище Google для пользователя (отсюда временной загрузки на сервер)

ответ

0
send_data data.read, disposition: 'attachment', stream: 'true', buffer_size: '4096' 

Добавить в stream: true

+0

Можете ли вы предоставить какое-то объяснение, пожалуйста? – Cherniv