在文件系统中存储图像会破坏文件.有没有更好的方法来写这个?为什么我会破坏文件?

Ric*_*nen 1 ruby post file-upload image sinatra

post '/upload' do
  unless params[:file] && (tmpfile = params[:file][:tempfile]) && (name = params[:file][:filename])
    return haml(:upload)
  end
  time = Time.now.to_s
  time.gsub!(/\s/, '')
  name = time + name
  while blk = tmpfile.read(65536)
    File.open(File.join(Dir.pwd,"public/uploads", name), "wb") { |f| f.write(tmpfile.read) }
  end
  'success'
end
Run Code Online (Sandbox Code Playgroud)

一切都在预期文件最终被破坏的地方.

Xav*_*olt 5

这个看起来非常时髦:

while blk = tmpfile.read(65536)
    File.open(File.join(Dir.pwd,"public/uploads", name), "wb") { |f| f.write(tmpfile.read) }
end
Run Code Online (Sandbox Code Playgroud)

我猜你一次尝试读取你的临时文件65536字节块,然后将这些块连续写入你的目标文件.但你永远不会写blk,这是你读的第一个块; 你改写文件的其余部分(tempfile.read).即使这个循环确实写了它应该的块,它会为每个块重新打开文件,覆盖旧内容!无论如何,我怀疑你的意思是这样的:

File.open(File.join(Dir.pwd,"public/uploads", name), "wb") do |f|
    while(blk = tempfile.read(65536))
        f.write(blk)
    end
end
Run Code Online (Sandbox Code Playgroud)

也就是说,如果您将文件作为临时文件(可能已经在您的本地文件系统上),您可能需要做的就是移动该文件?如果是这种情况会更快 - 如果源和目标位于同一磁盘上,则只需交换一些文件系统指针,而不是复制所有数据.

希望有所帮助!