2010-04-21 24 views
16

Próbuję przesłać pliki za pomocą Sinatry. Mam kod here, ale otrzymuję komunikat "metoda file_hash nie istnieje" (zobacz /lib/mvc/helpers/helpers.rb).Przesyłanie plików za pomocą Sinatry

Co się tutaj dzieje? Czy jest jakaś zależność, której mi brakuje.

+0

Zakładam, że próbujesz użyć spinacza z tym. Czy możesz ponownie wkleić swój kod (link prowadzi do martwej strony)? W przeciwnym razie, jakie było twoje rozwiązanie? – slant

Odpowiedz

27

Miałem szczęście z przykładowym kodem znajdującym się na this thread.

włączenie go tutaj w przypadku łącza kiedykolwiek zniknie:

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 

Wtedy twój widok będzie wyglądać następująco. Wykorzystuje haml, ale ważną częścią jest nie zapomnij ustawić enctype w elemencie formularza, w przeciwnym razie po prostu nazwę pliku zamiast obiektu:

%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

znalazłem, nieco zmieniony i używane to:

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 

Oryginał ma numer https://github.com/tbuehlmann/sinatra-fileupload, ale występują problemy z konfiguracją w moim środowisku. Nie zapomnij użyć enctype="multipart/form-data" i method='POST' w formularzu przesyłania.

+0

W mojej sytuacji stwierdzam, że pierwszy klawisz skrótu jest łańcuchem - a nie symbolem - np. 'params ['plik']' –

Powiązane problemy