2010-12-01 3 views
4

ファイルの一時ダウンロードアドレスを一定期間生成する方法を知りたいのですが、私はそれがベストプラクティスではないと知っているでしょう。おそらくHttpHandlersを使うのはhttp://www.devx.com/codemag/Article/34535/1954です。
しかし、私はGUIDやその他の秘密の命名法を使ってファイル名を生成するためにurlrewritingをどのように使うことができるのか不思議です。限られた時間利用可能です。
誰かが私にそれに関する良い記事を指摘していただければ幸いです。一時ファイルダウンロードリンク

+0

あなたはASP.NET MVCを使用していますか? – Aliostad

+0

私はWebformsを使用します。 – Kamyar

+1

この場合、URL書き換えを使用して得られるものは?なぜguidはクエリ文字列内にないのですか? –

答えて

6

まあまずあなたが識別子のいくつかのフォームを必要とします。あなたはGUIDを提案し、それは簡単に実行されます。Guid.NewGuid().ToString("n")はあなたにそのような識別子を与えます。

あなたはURIの書き換えを話しますが、それは本当にちょっとした磨きです。 /myFiles/a948ec43e5b743548fd9a77c462b953e/myFiles/download.aspx?id=a948ec43e5b743548fd9a77c462b953eに変更するか、(ルックアップテーブルを確認した後で)myFiles/download.aspx?id=3またはmyFiles/download.aspx?fileName=myNewDownload.pdfに書き換えることもできます。これは他のURI書き換えタスクと同じなので、ここでは無視し、/myFiles/download.aspx?id=a948ec43e5b743548fd9a77c462b953eに書き換え要求があるかどうかを確認します。

大丈夫です。識別子があります。ストリーム、コンテンツタイプ、有効期限の3つに一致させる必要があります。

このすべてをファイルシステムに格納することもできますし、すべてをデータベースに格納することも、ストリームがファイルシステム内のファイルとして格納されるパスを含むデータベース内の詳細を格納することもできます。

のような名前のファイル・システムに格納それを言うことができます:

a948ec43e5b743548fd9a77c462b953e.application_pdfとa5d360178ec14e97abd556ed4b7709cf.text_plain、私たちは、通常のWindowsファイル拡張子を使用していないのcharset = UTF-8

注意アップロードマシンがあなたのサーバーと異なるバインディングを持っている場合にもうまく対処します。

a948ec43e5b743548fd9a77c462b953eが必要なアイテムの場合、作成日を最初に見てください。ファイルが期限切れになっている場合(ファイルの有効期限が切れている場合)、ファイルが期限切れであることを示すエラーメッセージと共に410GONEヘッダーを送信しますこの時点でファイルを削除して使用をクリーンアップすることもできますし、おそらくファイルを削除してファイルが存在していたが、0バイトの記憶領域になるようにすることもできます。

それ以外の場合は、Response.ContentTypeを "application/pdf"に設定してからResponse.TransmitFileに設定して送信します。

ストリームをファイルとは別の方法で保存した場合は、小さな塊(4096はシステムの他の部分の他のバッファとよく一致します)に送信し、メモリの問題を防ぐために大規模な電話Response.Flush()を定期的に呼び出してください。

これは基本的なシステムです。細心の注意を払うのは、元のファイル名を格納してそれをコンテンツ処理ヘッダーに送信し、Range要求に従うことで、ユーザーは最初から開始する必要はなく、失敗したダウンロードを再開できます。

これは、正しい人だけがファイルを持っていることを保証するために使用されるあらゆる認証とはかなり直交しています。どのような種類のログインシステムと一緒に使用してもかまいません。

+0

それは完全で徹底的な答えでした。ありがとうございました – Kamyar

3

使用しているASP.NETフレームワークに関係なく、ファイルID(私が所有しているもの)とサーバー側で復号化してタイムスタンプに対して検証できるDateTimeを暗号化する暗号化トークンが好きです。ここで

は単純な実装です:

public static string GetDownloadToken(int fileId) 
    { 
     byte[] idbytes = BitConverter.GetBytes(fileId); // 4 bytes 
     byte[] dateTimeBytes = BitConverter.GetBytes(DateTime.Now.ToBinary()); // 8 bytes 
     byte[] buffer = new byte[16]; // minimum for an encryption block 
     string password = "password"; 

     byte[] passwordBytes = Encoding.ASCII.GetBytes(password); 
     Array.Copy(idbytes, 0, buffer, 0, idbytes.Length); 
     Array.Copy(dateTimeBytes, 0, buffer, idbytes.Length, dateTimeBytes.Length); 
     byte[] encryptedBuffer = new byte[256]; 
     using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) 
     { 
      int count = sha1.TransformBlock(buffer, 0, buffer.Length, encryptedBuffer, 0); 
      return Convert.ToBase64String(encryptedBuffer, 0, count); 
     } 
    } 
+0

ありがとうございます。それはあなたが提供した非常に興味深いコードです。しかし、私は動的URLの書き換えについても言及した明示的な解決策についてはまだ不思議です。この問題についても少し気をつけてください。 @Kamyar。 – Kamyar

+1

あなたが必要とするのは、コンテンツタイプをapplication/octet-streamに設定し、バイトをレスポンスに書き込むASPXページだけです。しかし、あなたがジョンの答えに満足しているのを見ました。私はイラン人でもあり、仲間のイラン人を見てうれしいです! – Aliostad