Подтвердить что ты не робот

Загрузка файла с помощью Sinatra

Я пытаюсь загрузить файлы с помощью Sinatra. У меня есть код здесь, но я получаю ошибку "метод file_hash не существует" (см./Lib/mvc/helpers/helpers. Р.Б.).

Что здесь происходит? Есть ли какая-то зависимость, которой я не хватает.

4b9b3361

Ответ 1

Мне повезло с кодом примера, найденным на этот поток.

Включая его здесь, если связь когда-либо исчезает:

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

Тогда ваше представление будет выглядеть так. Это использует HAML, но важной частью является не забыть установить enctype в вашем элементе формы, иначе вы просто получите имя файла вместо объекта:

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

Ответ 2

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>

Ответ 3

Я нашел, немного изменил и использовал это:

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

Оригинал находится по адресу https://github.com/tbuehlmann/sinatra-fileupload, но у меня есть некоторые проблемы с конфигурацией в моей среде. Не забудьте добавить enctype="multipart/form-data" и method="POST" в форму загрузки.