【问题标题】:Rails: Download file from another server (without reading file)Rails:从另一台服务器下载文件(不读取文件)
【发布时间】:2017-11-28 13:54:16
【问题描述】:

我有一个 Rails 应用程序,其中包含从另一台服务器下载文件的链接。 我想尝试防止“容易”检测到实际的文件 url/位置。

我尝试使用 send_file 但这似乎只适用于本地文件?

然后我尝试使用 send_data - 这似乎仅在第一次读取文件时才有效(例如 file.open ...)。我希望能够在不读取文件的情况下发送文件,因为某些文件非常大,因此需要很长时间并且没有用户反馈等...

基本上,我想要的行为与我只是链接到/提供直接文件 url 的行为相同:下载从浏览器打开并开始。

正如我所提到的,我想通过控制器(使用 send_file/data 方法)处理下载的原因是我确实希望文件的位置能够“轻松”检测到。

我希望我已经解释得足够好了:)

感谢您的建议

干杯, 乔恩。

【问题讨论】:

    标签: ruby-on-rails file download


    【解决方案1】:

    所以您想将数据从公共 URL 流式传输到客户端而不读取它?如果要将其发送给客户,则必须以某种方式阅读它。重定向是这里最好的解决方案,但您不喜欢重定向,因为公共 URL 很难看。

    您可以尝试从 Net::HTTP read_body(产生可枚举)流式传输 response_body(接受枚举)。这可能会减少您的内存占用。

    def DownloadController
      def show
        source = URI('http://www.example.com/some-big-pdf.pdf')
    
        # Tell the client to download the response with given filename
        headers['Content-Disposition'] = 'attachment; filename="some-big-pdf.pdf"'
    
        Net::HTTP.start(source.host, source.port) do |http|
          req = Net::HTTP::Get.new source
    
          http.request(req) do |res|
            self.response_body = res.read_body
          end
        end
      end
    end
    

    编辑:当然send_data 也可以从缓冲区读取:

    http.request(req) do |res|
      send_data res.read_body, filename: 'some-big-pdf.pdf', disposition: 'download'
    end
    

    但是,请注意,这占用一个工作进程直到完成。您应该确保有足够的工作人员来处理同时下载。您可能还想在您的网络服务器(NGINX?)中而不是在 Rails 中考虑在上游执行此操作。

    有关这些方法的更多详细信息,请参阅 Net::HTTP#read_bodyActionController::Metal#response_body=。另见https://coderwall.com/p/kad56a/streaming-large-data-responses-with-rails

    【讨论】:

    • 非常感谢您的回复和信息!!!这对于较小的文件非常有用,但对于较大的文件它会挂起(我猜是读取文件内容)。最好从浏览器开始下载,这样用户至少可以从浏览器 UI 组件等中看到下载进度......例如与您仅从 href 指向服务器/文件相同的行为。
    • 您尝试过send_data 吗?它在这里的运行速度比self.response_body= 快了一吨。
    • 是的,我试过 send_data,它也很慢 :)(我有大文件)...基本上,我只是希望它开始下载而不必先打开/读取文件。跨度>
    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多