2011-08-04 91 views
2

CMSのように管理者側からフォルダにファイルをアップロードしようとしています。 フロントエンドにファイルをダウンロードするためのリンクが表示されます。 管理者側では、参照を削除するだけでなく、実際のファイルをサーバーから削除したいと考えています。ここでアップロードしたファイルをASP.NET MVC3のサーバーから削除する

は、アップロードされたファイル保存し、私のコントローラの一部です:Createビューで

[HttpPost] 
public ActionResult Upload(HttpPostedFileBase file) 
{ 
    if (file != null && file.ContentLength > 0) 
    { 
     var fileName = Path.GetFileName(file.FileName); 
     var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
     file.SaveAs(path); 

     ViewBag.fileName = fileName.ToString(); 

     return RedirectToAction("Create", new {fileName = fileName }); 
    } 

    return RedirectToAction("Index"); 
} 

を、管理者は、その文書に関するその他の詳細情報を入力させ、それを一緒にテーブルに保存されていますfileName。

今、document.pdfのようなそのドキュメント名にリンクする必要があります。 App_Dataフォルダの下のアップロードフォルダにリンクすることもできますか?

また、ファイルを削除するにはどうしたらいいですか?

+0

私はこれをPDFでやってしまいました。それは「うまくいく」と思いましたが、メモリの問題などについて心配する必要があるのだろうか、FileStreamResultsはすべてを処理しますか? 'public ActionResultドキュメント(文字列ファイル名){try {var fn = fileName; var fpath = Path.Combine(Server.MapPath( "〜/ App_Data/uploads")、fn);新しいFileStreamResultを返します(新しいFileStream(fpath、FileMode.Open、FileAccess.Read、FileShare.Read)、 "application/pdf")。 } ... ' – Par6

+0

あなたのウェブアプリケーションがどれだけ多くのトラフィックに遭遇するかによって異なります。何人のユーザーがいますか? –

+0

@Alexほとんどの内部スタッフが使用します。基本的にトラフィックはあまりありません。しかし、もっと公の場を作りたいと思ったら、ベストプラクティス情報への指針はありますか?あなたの助けをもう一度ありがとう。 – Par6

答えて

1

ファイルのダウンロードを処理する別のコントローラを作成します。また、ユーザーが直接ファイルに直接リンクすることもできません。 DownloadMyFileFromSomeWhere(string)は、ブロブ、あるいはローカルサーバのようないくつかのストレージからバイト配列フ​​ァイルを取得することができるはず

public ActionResult GetDocument(String pathName) 
{ 
    try 
    { 
     Byte[] buffer = DownloadMyFileFromSomeWhere(pathName); 
     FileContentResult result = new FileContentResult(buffer, "PDF"); // or whatever file ext 
     // these next two lines are optional 
     String[] folders = pathName.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);    
     result.FileDownloadName = folders[folders.Length - 1]; 

     return result; 
    } 
    catch (Exception ex) 
    { 
     // log the error or something 
    } 
    return new HttpNotFoundResult(); 
} 

。あなたは同じアプローチを行うことができ、管理者側について

private Byte[] DownloadMyFileFromSomeWhere(string pathname) 
{ 
    Byte[] file = System.IO.File.ReadAllBytes(Server.MapPath(pathname)); 
    return file; 
} 

:それはのようなものを見ることができ、ファイルやデータベース内のエントリを削除するには、別のコントローラを書きます。

+0

あなたは、DownloadMyFileFromSomeWhere()がどのように見えるか、別の記事への参照を持っているかについてもっと詳しく説明できますか?ありがとう、 – Joe

+0

@Joe、あなたのウェブサーバのローカルファイルへの単純なフェッチ、またはブロブやクラウドからのダウンロードが可能です。まず始めに 'System.IO.File.ReadAllBytes(filePath);を見てください。 –

+1

答えにDownloadMyFileFromSomeWhereメソッドを追加しました。 – Joe

0

いくつかの注意:あなたがどこかにファイルを保存する権限を持っている場合は

  • は、あなたもそれを削除する権利を持っている必要があります。これを行うには、通常のファイル操作を使用できます。
  • IIS は、App_Dataの下にあるファイルへのリンクをブロックする必要があります。あなたは、オプションのカップルがあります
    • その場所からファイルを読み込むアクションを作成すると、ブラウザにそれをストリーミング
    • 別の場所に保管して - どこかにユーザーが実際にアクセスする必要がありますということ。

最初のオプションの利点は、第二のオプションはでweb.configファイルを追加するために、あなたを必要とするのに対し、あなたは簡単に、ファイルへのアクセスを確保するために、あなたの行動になど、認証を追加することができるということです適切なロールとアクセス権を持つフォルダしかし、一方では、アクションメソッドに適切なヘッダーを指定しなければならないので、ブラウザーはIISがあなたのためにそれを把握するのではなく、ファイルの処理方法を知っています。

関連する問題