代码之家  ›  专栏  ›  技术社区  ›  stephenmurdoch

Rails3:链接到异地mp3文件,并将它们保存到用户的硬盘上,而不是在浏览器中传输

  •  1
  • stephenmurdoch  · 技术社区  · 16 年前

    = link_to "mp3", "http://website-where-file-is-stored.com/file-123456.mp3"
    

    当用户单击链接时,文件开始在浏览器中播放。我想该文件下载到用户硬盘驱动器后,他们点击链接。

    this one 和 this one 它将在不同情况下起作用的方法推广到我自己。

    我有多个文件。每个文件都存储在没有运行rails应用程序的远程服务器上。

    我不要求用户在下载任何东西之前获得授权,所以我不希望我的rails应用程序以任何方式被调用,因为我需要对我的rails进程保持保守。

    这是我需要在config.ru中执行的操作吗?有没有一个指南或教程详细说明最好的方法来做到这一点?

    我知道我需要设置 Content-Disposition 但正如我所说的,我不知道如何做到这一点,因为我没有在远程服务器上运行rails应用程序,它只是一堆服务器空间。

    2 回复  |  直到 9 年前
        1
  •  1
  •   John Bachir    16 年前

    您可以在专用于文件下载的地方执行控制器操作。

    那个 行动有助于 redirect_to http://website-where-file-is-stored.com/file-123456.mp3

    要将文件作为附件下载而不在浏览器中呈现(例如,如果是电影或pdf),website-where-file-is-stored.com必须提供带有标题的文件 Content-disposition: attachment . 请在此处查看更多信息: http://www.boutell.com/newfaq/creating/forcedownload.html

        2
  •  0
  •   stephenmurdoch    16 年前

    好的,我通过将以下cgi脚本添加到远程服务器上的cgi bin来修复这个问题。脚本设置内容处置头。在我的例子中,脚本被命名为 “下载.cgi” .

    #!/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
    

    link_to 'Download', "http://path/to/filename.mp3" 我这样做:

    link_to 'Download' "http://path/to/cgi-bin/download.cgi?ID=filename.mp3"

    如果要使用相同的脚本,请记住: $files_location = "../"