У меня есть следующие действия загрузки в мой контроллер ресурсов: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 для пользователя (отсюда временной загрузки на сервер)
Можете ли вы предоставить какое-то объяснение, пожалуйста? – Cherniv