2009-03-25 10 views
0

私はRailsを使い始めていて、ユーザーがログインした後に、 のリンクをクリックしてexeファイルをダウンロードできます(たとえば、 ファイルはhttp://test.com/test.exeです) 。 exe ファイルへのリンクを隠しておきたい。このステップを実行する最良の方法は何か。ダウンロードするリンクを作成する質問

URLにリダイレクトすることを考えていましたが、 には2つのリダイレクト機能を使用できないというエラーが表示されています。

また、NET:HTTPリクエストでHTTPリクエストを使用することを考えていましたが、これを実装する方法はありません( )。

ありがとうございます!

答えて

1

コード内のファイルを読み、それをそのままクライアントに出力する必要があります。 その前に、関連するヘッダを送信する:

Content-type: application/octet-stream 
Content-Disposition: inline; filename=[file name you want the user to see] 
Content-length: [file size] 

同じ場所に2つのリダイレクトを行うことは悪いですなぜ、それは一度に2つの方向に車を操縦しようとしているようなものです...

を、それが良いかもしれませんファイルTHRプロキシへ

Content-Type: application/force-download 

代わりの

Content-type: application/octet-stream 
+0

ですが、このファイルはほぼ1GBです。私は特定のユーザーにソフトウェアをダウンロードさせようとしていますが、そのソフトウェアを隠しておくことを全員に配布しないようにしたいと考えています。 –

+0

うわー、1ギグは通常のhttp用ではないので、あなたはそれを壊す必要があります(rarを使います)。 私の解決策が必要です。あなたはコード内のファイルを読む(サーバー側で、ユーザーはファイル名やその場所を見ることができません)、ランダムな名前で出力します(2番目のヘッダーを参照)。 –

+0

Itay、返事をありがとう。 私はあなたの記事、LOLを理解しようとしています。ありがとう、いくつかのコードサンプルを教えてください! –

0

を使用あなたのコントローラは大丈夫、あなたはopen-uriを使うことができます。お使いのコントローラ

def download 
    send_data(open(params[:url]).read, 
    :filename => 'somefilename', 
    :disposition => 'attachment' 
) 
end 

EDITでenvironment.rbに

require 'open-uri' 

:プロキシにファイルをしたくない場合は、(URL)をredirect_toする必要があります。リダイレクトに関するメッセージが2回呼び出された場合は、同じアクションからレンダリングとリダイレクトの両方を行うことはできません。

def present_download 
    @download = Download.find(params[:id]) 
    # implicitly calls render :action => :present_download 
end 

def download_file 
    @download = Download.find(params[:id]) 
    respond_to do |format| 
    format.html { redirect_to(@download.url) } 
    end 
end 

そして、あなたのビュー(present_download.html.erb)中:あなたはビューをロードして、ダウンロードを開始し、二つの動作を使用する必要がある場合は、私は以下のコードを試してみました

<html> 
    <head> 
    <meta http-equiv="refresh" content="1;url=<%= url_for :action => :download_file -%>" /> 
    </head> 
    <body> 
    Your download will automatically start… 
… 
+0

ポストに感謝します。 send_fileで何かできますか? 私の元の投稿に私がこれを含めたかどうか分からない、exeファイルが私のレールアプリケーションが走っているのと同じサーバにない。 –

+0

また、ファイルが1GBファイルであれば、ファイル全体(open.url.read)を読んでいることをコードスニペットで気付きましたか? –

+0

いいえ、send_fileとsend_dataはどちらもファイルの内容を読み込む必要がありますが、Railsアプリからのファイルを含むディスクにアクセスできれば、send_fileの方がはるかに効率的です。 –

0

を、 exeファイルの例ですが、500 MBを超えるファイル全体を読み取るようなコードになります。私はそれだけで私にオプションをexeファイルを保存するようにしたい!ありがとう!

def download 
    send_data(open('http://mirrors.gigenet.com/ubuntu/intrepid/ubuntu-8.10-desktop-i386.iso').read, 
    :filename => 'ubuntu-8.10-desktop-i386.iso' , 
    :type => 'application/force-download', 
    :disposition => 'attachment') 
    end 
関連する問題