使用Sinatra进行文件上传

20

我正在尝试使用Sinatra上传文件。 我有这里的代码(链接),但是我遇到了“方法file_hash不存在”的错误(请参见/lib/mvc/helpers/helpers.rb)。

这里发生了什么? 我是否缺少某些依赖项。


我猜你是在尝试使用Paperclip。你能再贴一下你的代码吗(链接失效了)?否则,你是怎么解决的? - slant
3个回答

32

我在这个帖子中找到了一个示例代码,并且使用起来很顺利。

这里也包含它的代码,以防链接失效:

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"}

似乎将其转储到控制台 - barlop

26
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>

5
我发现这个代码,稍作修改并使用了它:
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"

在我的情况下,我发现第一个哈希键是一个字符串 - 而不是一个符号 - 例如 params['file'] - Ross Attrill
1
修复代码行:target = "public/files/#{filename}" - Boguslaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接