2010-04-21 23 views
16

Estoy tratando de cargar archivos con Sinatra. Tengo el código here, pero aparece el error "el método file_hash no existe" (ver /lib/mvc/helpers/helpers.rb).Carga de archivos con Sinatra

¿Qué está pasando aquí? ¿Hay alguna dependencia que me falta?

+0

Supongo que está tratando de usar un clip con esto. ¿Podrías volver a pegar tu código (el enlace conduce a una página muerta)? De lo contrario, ¿cuál fue tu solución? – slant

Respuesta

27

He tenido buena suerte con el código de ejemplo que se encuentra en this thread.

Incluyendo aquí en caso de que el enlace nunca desaparece:

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 

Luego, su vista se vería así. Esto utiliza HAML, pero lo importante es no olvidar para establecer el enctype en su elemento de formulario, de lo contrario se acaba de obtener el nombre del archivo en lugar de un objeto:

%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

encontré, ligeramente cambiado y usados esto:

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 

El original está en https://github.com/tbuehlmann/sinatra-fileupload pero tienen algunos problemas de configuración en mi entorno. No olvides usar enctype="multipart/form-data" y method='POST' en el formulario de carga.

+0

En mi situación, creo que la primera clave hash es una cadena, no un símbolo, por ejemplo. 'params ['file']' –