2010-04-21 22 views
16

Sto tentando di essere in grado di caricare file con Sinatra. Ho il codice here, ma sto ricevendo l'errore "il metodo file_hash non esiste" (vedi /lib/mvc/helpers/helpers.rb).Caricamento file con Sinatra

Cosa sta succedendo qui? C'è qualche dipendenza che mi manca.

+0

Suppongo che tu stia cercando di usare la graffetta con questo. Potresti incollare nuovamente il tuo codice (il link porta a una pagina morta)? Altrimenti, qual è stata la tua soluzione? – slant

risposta

27

Ho avuto fortuna con il codice di esempio trovato su this thread.

Compreso qui nel caso in cui il legame mai scompare:

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 

Allora la vostra vista sarebbe simile a questa. Questo utilizza HAML, ma la parte importante è non dimenticare di impostare l'enctype nel vostro elemento modulo, altrimenti sarà solo ottenere il nome del file, invece di un oggetto:

%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

ho trovato, un po 'cambiato e utilizzati questo:

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 

L'originale è a https://github.com/tbuehlmann/sinatra-fileupload ma hanno alcuni problemi di configurazione al mio ambiente. Non dimenticare di usare enctype="multipart/form-data" e method='POST' nel modulo di caricamento.

+0

Nella mia situazione, trovo che la prima chiave di hash sia una stringa - non un simbolo - es. 'Params [ 'file']' –