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)
一切都在预期文件最终被破坏的地方.
这个看起来非常时髦:
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)
也就是说,如果您将文件作为临时文件(可能已经在您的本地文件系统上),您可能需要做的就是移动该文件?如果是这种情况会更快 - 如果源和目标位于同一磁盘上,则只需交换一些文件系统指针,而不是复制所有数据.
希望有所帮助!
| 归档时间: |
|
| 查看次数: |
257 次 |
| 最近记录: |