如何通过Sinatra上传多个文件并避免NoMethodError - 未定义方法`read'for“#<file:0x0000000xxxxxx0>”:String

时间:2017-04-27 17:30:47

标签: ruby sinatra

我正在尝试从多文件数组中上传第n个文件:

post '/upload2' do
  puts params
  #pp params
  mx=params['images'].map{|f| f[:filename] }.join(";")
  filename=mx.split(';')[0] 
  puts filename 
  mz= params['images'].map{|f| f[:tempfile] }.join(";")
  file=mz.split(';')[0]
  puts file

  path = "/home/user/Descargas/sinatra_ajax-master/#{filename}"

  File.open(path, 'wb') do |f|
    f.write(file.read)
  end
  erb :index

end

我的HTML是:

<form action="/upload2" method="post" enctype="multipart/form-data">
  <input type="file" name="images[]" multiple />
  <input type="submit" />
</form>

但是我的代码失败了,我不知道为什么。

2 个答案:

答案 0 :(得分:1)

在临时文件上运行join()时:

mz= params['images'].map{|f| f[:tempfile] }.join(";")

您正在使用File对象并将其强制转换为字符串to_s()。但to_s的默认File是创建这个通常无用的东西:

"#<File:0x0000000xxxxxx0>"

这就是您收到错误消息的原因。

至于如何修复它,解决方案就是不将文件转换为字符串。我不完全理解你为什么要拿一个数组,把它加入一个字符串,然后立即将字符串拆分成一个数组。我不会那样做:

post '/upload2' do
  puts params

  filename = params["images"][0][:filename]
  puts filename

  tempfile = params["images"][0][:tempfile]
  puts tempfile

  path = "/home/user/Descargas/sinatra_ajax-master/#{filename}"

    File.open(path, 'wb') do |f|
      f.write(tempfile.read)
    end

  erb :index

end

答案 1 :(得分:0)

感谢所有

,这是我的解决方案

更新

此代码用于上传多行,但问题只是代码的一部分

这是第一个代码

 post '/upload2' do
      puts params
      #pp params



    @filename = params[:images][0][:filename]
    file = params[:images][0][:tempfile]

    File.open("/home/user/Descargas/sinatra_ajax-master/#{@filename}", 'wb') do |f|
     f.write(file.read)
    end





      erb :index

    end

这是完整的代码

post '/upload2' do
    puts params['images'].map{|f| f[:filename] }.join(";")
    k=params['images'].map{|f| f[:filename] }.join(";")
    $param=k.chomp.split(";")
    array_length= $param.length   #or $param.size
    array_lengthx = array_length - 1
    puts "legth of $param is : #{array_length}"



    i = 0
    i=i-1
    puts array_lengthx
    puts i
    while i.to_i < array_lengthx do
    i =i+1
    puts i
    @filename = params[:images][i][:filename]
    file = params[:images][i][:tempfile]
    path="/home/user/Descargas/sinatra_ajax-master/#{@filename}"
    File.open("/home/user/Descargas/sinatra_ajax-master/#{@filename}", 'wb') do |f|
     f.write(file.read)
    end

    end

end

这是html代码

<form action="/upload2" method="post" enctype="multipart/form-data">
  <input type="file" name="images[]" multiple />
  <input type="submit" />
</form>