ruby-on-rails - 如何更改文件名提示文本浏览器另存为对话框?

标签 ruby-on-rails browser content-disposition

在我的网页(由 Rails 渲染)中,我想让用户右键单击照片以显示浏览器的“另存为”对话框,让用户将照片保存到硬盘上。

但是,我服务器上的照片具有不寻常的文件名(长十六进制名称),没有文件扩展名。另存为对话框中的文件名提示有这个丑陋的文件名。如果用户点击保存,他们最终会得到一个名字很差的文件,没有文件扩展名。

网页知道照片的真实文件名(例如,从相机中取出的名称)。有没有办法让我用我选择的文件名以编程方式覆盖“另存为”对话框的文件名提示?

我知道 内容处理 header ,并且可以通过此 header 指定文件名。但是,我认为为了能够使用此 header ,我需要将整个文件加载/渲染到浏览器。如果可供下载的 Assets 是电影,则加载文件可能会使浏览器超时……例如,如果它是 100meg 视频。

想法?

-一种

最佳答案

我想我理解这里的问题,因为不久前我自己至少遇到(并解决了)其中的一部分。

我有一些大 mp3's我在我的 website 上链接到它们

几个问题

  • 我需要设置我的 内容处置标题到 附件为了防止文件在用户单击下载按钮时自动流式传输
  • 我的文件在远程服务器上
  • 我的文件很大 (100MB)
  • 如果处理不当,大文件可能会占用 Rails Controller

  • 现在,Michael Koziarsky 在 this article 中提供建议在提供大文件时保持 Rails 进程空闲的最佳方法是在 Controller 中创建一个下载操作,然后执行如下操作(注意 x_sendfile=>true 的使用):
      def download
        send_file '/path/to/podcast.mp3', :type => 'application/octet-stream', :disposition => 'attachment', :filename=>'something.mp3', :x_sendfile=>true
      end
    

    :x_sendfile 告诉 apache 让文件通过而不占用 rails Controller 进程。其余代码设置文件名和内容处置 header 。

    太好了,但我在 heroku ,就像现在的其他人一样。所以我不能使用 x_sendfile。

    我发现我无法修改 nginx 配置文件,因为它被 heroku 锁定,因此无法获得 x-accel-redirect (nginx 等效于 x-sendfile )工作

    所以,我决定添加一个 perl script (见下文)到我们 Assets 主机上的 cgi-bin,这个脚本将内容处置设置为 附件并为我们的文件命名。

    而不是像这样进行 Restful 下载:
    link_to "download", download_podcast_path(@podcast.mp3)
    

    我们只是链接到 mp3,确保我们通过 cgi-bin 进入,以便在每个离开服务器的 mp3 上调用 perl 脚本
    # I'm using haml
    %a{:href=>"http://afmpodcast.com/cgi-bin/download.cgi?ID=#{@podcast.mp3}"}
      download
    

    结果是我的rails Controller 是当有人下载​​文件时不再被调用

    我找到了 perl 脚本 here把它切碎一点来为我工作:
    #!/usr/local/bin/perl -wT
    
    use CGI ':standard';
    use CGI::Carp qw(fatalsToBrowser);
    
    my $files_location;
    my $ID;
    my @fileholder;
    
    $files_location = "../";
    
    $ID = param('ID');
    
    open(DLFILE, "<$files_location/$ID") || Error('open', 'file');
    @fileholder = <DLFILE>;
    close (DLFILE) || Error ('close', 'file');
    
    print "Content-Type:application/x-download\n";
    print "Content-Disposition:attachment;filename=$ID\n\n";
    print @fileholder
    

    我的代码,在 github但是在您的机器上使用它可能会遇到各种各样的问题,因为我大量使用存储在 bashrc 中的 ENV 变量并且我没有文档或测试^隐藏^

    关于ruby-on-rails - 如何更改文件名提示文本浏览器另存为对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3534097/

    相关文章:

    ruby-on-rails - rails ajax_pagination 找不到文件 'history'

    javascript - 如何在浏览器中选择所有 *renderable* 文本元素

    iphone - 发送带有帐户信息的图片,例如 accountID(ios)

    javascript - 如何从内容配置中获取文件名

    ruby-on-rails - 升级到rails 4.1后无法创建新的ActiveRecord

    ruby-on-rails - 如何从 Paypal 交易中获取国家和州?

    ruby-on-rails - 表单内 'has many' 关联中记录的字段

    c# - C#:并行形式,多线程和 “applications in application”

    javascript - 如何编写具有多个:eq's in single expression?的jQuery选择器

    php - 如何使用 content-disposition header 设置下载的 UTF-8 文件名?