Ruby Tempfile下载缺少的标题

时间:2013-11-27 17:14:39

标签: ruby sinatra temporary-files

我正在使用Sinatra应用程序中的文件上传功能。它既小又简单,只使用Ruby的File类并手动将临时文件保存到目录中。我正在尝试使用Tempfile实现相同的功能。

我上传工作正常,但现在当我点击链接下载文件时,文件名只是一个数字。它正确下载和读取文件,但不保留文件名或文件类型。在我进行更改之前,文件将通过重定向到服务器上新上传的文件端点在浏览器中打开。我想恢复这个功能。

我的代码如下:

post "/positions/:id/attachment" do
  html_settings
  new_data = post_data
  if params[:file_attachment][:file].present?
    file      = params[:file_attachment][:file]
    # file looks like this when uploaded:
    #{:filename=>"Screen Shot 2013-11-26 at 4.36.13 PM.png", :type=>"image/png", :name=>"file_attachment[file]", :tempfile=>#<File:/var/folders/85/0kp_g81s1ws16zths3s8d9p80000gn/T/RackMultipart20131127-2757-1kdficq>, :head=>"Content-Disposition: form-data; name=\"file_attachment[file]\"; filename=\"Screen Shot 2013-11-26 at 4.36.13 PM.png\"\r\nContent-Type: image/png\r\n"}

    # Tempfile object
    temp_file = Tempfile.new(file[:filename], 'uploads') # Create tempfile, save to uploads folder

    begin
      write_tempfile(file, temp_file)
      new_data['file_attachment']['file'] = temp_file
      new_data['multipart'] = true

      # At this point, the new_data hash looks the same except for a small difference in the path name
      # Before tempfile - {"file_attachment"=> {"display_name"=>"test","file"=>#<File:uploads/Screen Shot 2013-11-26 at 11.35.36 AM.png>}, "id"=>"1"}
      # With tempfile - {"file_attachment"=> {"display_name"=>"test", "file"=>#<File:/path/to/uploads/Screen Shot 2013-11-26 at 4.36.13 PM.png20131127-2757-eb6w6r>}, "id"=>"1", "multipart"=>true}

      response = api_post(attachment_upload_endpoint(params[:id]), new_data)
    ensure
      delete_tempfile(temp_file)
      response
    end
  end
end

助手方法:

def write_tempfile(file, temp)
  file[:tempfile].rewind # Rewind before reading
  temp.write(file[:tempfile].read) # Write to the temp file
  temp.rewind # Rewind in order to be read
end

def delete_tempfile(temp_file)
  #close! calls #close AND #unlink. #unlink deletes the file
  temp_file.close!
end

上传文件后,会有指向https://myserver.com/positions/1/file_attachments/46

的链接

有没有人理解为什么现在,当我点击该链接时,它会以文件名46下载该文件而不再在浏览器中下载?

我也在控制台中收到此通知: 资源解释为Document但使用MIME类型binary / octet-stream传输

感谢。

1 个答案:

答案 0 :(得分:1)

我能够使用扩展程序的一些额外解析:

  ext = file[:filename].split('.').last
  temp_file = Tempfile.new([file[:filename], ".#{ext}"])