2014-11-06 175 views
1

我正在使用byte[]來獲取要上傳到我的ASP.NET網站的文件的序列化版本。我使用HttpPostedFileBase您的視圖模型來保存上傳的文件在Web應用程序中存儲文件上傳的位置

public class MyViewModel 
{ 
    [Required] 
    public HttpPostedFileBase File { get; set; } 
} 

HomeController

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     if (!ModelState.IsValid) 
      return View(model); 

     byte[] uploadedFile = new byte[model.File.InputStream.Length]; 
     model.File.InputStream.Read(uploadedFile, 0, uploadedFile.Length); 

     // Where do I write the file to? 

     return Content("Upload complete"); 
    } 
} 
在我看來

最後我有

@model MyViewModel 
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <div> 
     @Html.LabelFor(x => x.File) 
     @Html.TextBoxFor(x => x.File, new { type = "file" }) 
     @Html.ValidationMessageFor(x => x.File) 
    </div> 
    <button type="submit">Upload</button> 
} 

上傳內容纔會被執行由我(管理員)提供,並且只有兩個應用程序安裝程序(.exe文件,一個8MB和另一個18MB)。我的問題是如何/在哪裏可以存儲上傳的文件,以便用戶可以下載這些文件?

謝謝你的時間。

+0

從技術上講,在大多數情況下,將上傳的文件存儲在webroot外部並通過Handler訪問它們總是好得多。這種方法的好處不僅在於安全性,而且在下載文件(日誌記錄,...)時可以執行其他任務,甚至可以在更改文件路徑時擁有永久鏈接。 – 2014-11-06 14:11:42

+0

謝謝你的時間。我把它存儲在數據庫中的原始數據是不是要走的路?另外,使用[this](https://www.google.co.uk/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&cad=rja&uact=8&ved=0CAcQjRw&url=http%3A%2F%2Fvikung-fu .deviantart.com%2Fart%2FBartman-The-Dark-Knight-91611234&ei = lI9bVL6vIIajgwTi7IK4AQ&bvm = bv.78677474,d.ZGU&psig = AFQjCNHFlPYcpR5ehl8nPccVP82C_CvmEw&ust = 1415373064457448)因爲您的Avitar會很棒! – MoonKnight 2014-11-06 15:12:27

+0

把它存儲在數據庫中也是一種可能性,確實可以提供相同的優點,因爲您還需要通過處理程序訪問它。數據庫存儲通常比文件存儲更昂貴,所以你可能想要保持存儲數據的大小非常低。也就是說,這兩種解決方案的巨大優勢是,您可以決定在事後更換任何其他解決方案,更新您的處理程序將使更改對用戶透明... – 2014-11-07 08:05:54

回答

1

通常您會使用App_Data文件夾來執行此操作。這將通過HttpContext.Current.Server.MapPath("~/App_Data/");訪問。

但是有concerns about uploading存儲數據在一個web應用程序的子文件夾(這可能會減少vNext的設計)。這些日子這樣的事情(用戶可能想要通過互聯網訪問)我會存儲在類似Azure StorageS3的東西,它有一定的成本,但它是如此之低以至於在大多數情況下不成問題(每GB每月0.0300美元)。

+0

感謝您的時間。在你回答之前,我開始創建'DownloadsDbContext:DbContext',在其中將文件存儲爲'byte'數組。大概從你的答案,這是一個壞主意?對於質量差的標準感到抱歉,我對網絡開發非常陌生,無人問津。找到簡單的設計查詢答案是非常困難的... – MoonKnight 2014-11-06 15:10:31

+0

你可以,這不是一個好主意,但我一般不會。傳統的數據庫不是一個非常好的存儲文件的地方,請參閱http://programmers.stackexchange.com/questions/150669/is-it-a-bad-practice-to-store-large-files-10-mb-in數據庫。數據庫存儲的成本通常比文件存儲更昂貴。現代數據庫提供了像SQL服務器FileTables一樣的混合文件/表格存儲功能 - 但是這對你所看到的東西來說可能是過度的。 – AlexC 2014-11-06 15:22:53

+0

謝謝。是的,我需要爲我們的用戶提供的是能夠在四種不同的安裝軟件包(從8MB到大約18MB)中下載最多的功能。所以你說我可以使用'HttpContext.Current.Server.MapPath(「〜/ App_Data /」);''來獲得服務器映射路徑''但是你能否提供關於如何將字節數組寫入的更多信息這個位置?感謝你的寶貴時間... – MoonKnight 2014-11-06 15:45:55

相關問題