2010-04-21 8 views
16

Ich versuche, Dateien mit Sinatra hochladen zu können. Ich habe den Code here, aber ich bekomme den Fehler "Methode file_hash existiert nicht" (siehe /lib/mvc/helpers/helpers.rb).Datei-Upload mit Sinatra

Was geht hier vor? Gibt es eine Abhängigkeit, die ich vermisse?

+0

Ich gehe davon aus, dass Sie versuchen, Büroklammer mit diesem zu verwenden. Könnten Sie Ihren Code erneut einfügen (der Link führt zu einer leeren Seite)? Ansonsten, was war deine Lösung? – slant

Antwort

27

Ich hatte viel Glück mit dem Beispielcode gefunden auf this thread.

es hier im Fall inklusive Link verschwindet immer:

post '/upload' do 
    unless params[:file] && 
     (tmpfile = params[:file][:tempfile]) && 
     (name = params[:file][:filename]) 
    @error = "No file selected" 
    return haml(:upload) 
    end 
    STDERR.puts "Uploading file, original name #{name.inspect}" 
    while blk = tmpfile.read(65536) 
    # here you would write it to its final location 
    STDERR.puts blk.inspect 
    end 
    "Upload complete" 
end 

Dann wie dies Ihrer Ansicht nach aussehen würde. Dies verwendet HAML, aber der wichtige Teil ist nicht zu vergessen, die enctype in Ihrem Formularelement zu setzen, sonst werden Sie nur den Dateinamen erhalten statt eines Objekts:

%form{:action=>"/upload",:method=>"post" ,:enctype=>"multipart/form-data"} 
    %input{:type=>"file",:name=>"file"} 
    %input{:type=>"submit",:value=>"Upload"} 
20
include FileUtils::Verbose 

get '/upload' do 
    erb :upload 
end 

post '/upload' do 
    tempfile = params[:file][:tempfile] 
    filename = params[:file][:filename] 
    cp(tempfile.path, "public/uploads/#{filename}") 
    'Yeaaup' 
end 

__END__ 

@@upload 
<form action='/upload' enctype="multipart/form-data" method='POST'> 
    <input name="file" type="file" /> 
    <input type="submit" value="Upload" /> 
</form> 
4

Ich fand, leicht verändert und verwendet dies:

if params[:file] 
    filename = params[:file][:filename] 
    tempfile = params[:file][:tempfile] 
    target = "public/files/#{filename) 

    File.open(target, 'wb') {|f| f.write tempfile.read } 
end 

Das Original ist bei https://github.com/tbuehlmann/sinatra-fileupload aber einige Konfigurationsfragen auf meine Umgebung. Vergessen Sie nicht, enctype="multipart/form-data" und method='POST' im Upload-Formular zu verwenden.

+0

In meiner Situation finde ich, dass der erste Hash-Schlüssel eine Zeichenfolge ist - kein Symbol - z. 'params ['Datei']' –