Ich habe die folgende Download-Aktion in meinen Ressourcen-Controller:Send_Data Zurückkehren beschädigte Dateien
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
Die Aktion eine Datei auf Google Storage (mit carrierwave
) gespeichert Downloads und Streams dann die Datei an den Browser. Ich habe versucht, mehrere verschiedene Konfigurationen der Parameter zu send_data und ich versuchte send_file. Am ehesten komme ich zu einer funktionierenden Lösung, wenn eine PDF-Datei heruntergeladen wird, aber beschädigt ist. (Manchmal lädt es aus Versehen ein Textdokument, und anstatt die erwarteten Dateiinhalten erhalte ich das Speicherobjekt der Datei wie unten gezeigt.
#<File:0x007fcdda128ea0>
Ich habe das Gefühl, das gleiche mit dem PDF-Download geschieht, mit der Ausnahme, dass die PDF-Viewer kann das PDF natürlich nicht rendern.
Ich habe sichergestellt, dass die in der Datenbank gespeicherte URL auf die richtige Datei zeigt und die data
-Variable korrekt initialisiert wird. Alles funktioniert wie erwartet bis zu dem Punkt, an den die Daten gesendet werden der Browser
Der Grund, warum ich dies tun, anstatt umleiten fesselndes auf die Datei-URL ist, weil ich möchte nicht den Speicherort der Datei auf Google-Speicher für den Benutzer (daher der temporären Download auf dem Server)
aussetzen Können Sie eine Erklärung geben Sie bitte? – Cherniv