0

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)

Antwort

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

hinzufügen in stream: true

+0

aussetzen Können Sie eine Erklärung geben Sie bitte? – Cherniv

Verwandte Themen