0

我可以直接導航到開發服務器上的這個圖像,並顯示它。ASP.NET MVC上傳的圖像文件夾部署後無法訪問

http://localhost:51122/Uploads/0a2234e6-71c2-4ca4-83b9-4bf9510f25bc 

但出版後,我收到了404

http://localhost/hts/Uploads/0a2234e6-71c2-4ca4-83b9-4bf9510f25bc 

Version info: 
Microsoft .NET Framework Version:4.0.30319; 
ASP.NET Version:4.0.30319.272 

如果它是一個MVC的路由問題,那麼爲什麼它在促進發展?

編輯: LOL - 因爲Uploads文件夾及其內容未被複制到已部署應用程序的文件夾中。路徑不存在。我想我認爲這不會是一個問題,因爲應用程序的數據庫不是問題。

我有關於MIME類型的第二個問題,因爲這些jpeg沒有擴展名,只是swfupload的GUID名。我在IIS中爲.創建了一個MIME類型,它是image/jpeg並顯示了圖像。我想我應該只是將擴展名添加到文件名中。

+0

是否有你不想保留文件擴展名的原因?我問,因爲一個MIME類型捕捉所有的圖像/ JPEG是不理想的。我只是想知道是否有特定的原因,或者是否有什麼事情導致你必須這樣做。 – 2012-02-08 04:25:05

+0

@ Splash-X我同意,這聽起來像是一場等待發生的災難。這些文件沒有擴展名,因爲我不知道如何從swfupload的在線示例中獲得它。我寧願保留擴展名並擺脫解決方法。因爲我是新手,所以我將不得不學習swfupload和.net文件處理。 – Benjamin 2012-02-08 06:04:09

+0

檢查我發佈的答案,它有一些方法的示例接受來自SWFUpload(如果您使用多上傳)的文件集合並傳回文件名。恰巧我的代碼返回一個帶有文件擴展名的GUID字符串。認爲它可以爲你節省一些時間。 – 2012-02-08 15:30:09

回答

1

因爲我已經與SWFUpload合作過,所以我想給你一些我用於ActionResult的代碼。以下是我使用的一些代碼。 「CAA」是我的項目命名空間,所以「CAA.Utility.IO」是我建立的一些幫助類的命名空間,這些幫助類包含在下面。

public ActionResult Index() 
    { 
     if (Request.Files.Count != 0) 
     { 

      StringBuilder sb = new StringBuilder(); 

      for (int i = 0; i < Request.Files.Count; ++i) 
      { 
       CAA.Utility.IO.IFileStore _fileStore = new CAA.Utility.IO.DiskFileStore(Server.MapPath("~/assets/uploads/temp")); 
       sb.Append(_fileStore.SaveUploadedFile(Request.Files[i])); 
      } 
      return new ContentResult() { Content = sb.ToString(), ContentType = "text/html" }; 

     } 
     else 
      return new ContentResult() { Content = "", ContentType = "text/html" }; 
    } 

而且我IFileStore類:

using System; 
using System.Web; 

namespace CAA.Utility.IO 
{ 
    public interface IFileStore 
    { 
     string SaveUploadedFile(HttpPostedFileBase fileBase); 
    } 
} 

而且我IDiskStore類:

using System; 
using System.Web; 
using System.IO; 
using System.Web.Hosting; 

namespace CAA.Utility.IO 
{ 
    public class DiskFileStore : IFileStore 
    { 
     public DiskFileStore() { } 
     public DiskFileStore(string UploadFolder) 
     { 
      this._uploadsFolder = UploadFolder; 
     } 

     public string UploadFolder 
     { 
      get 
      { 
       return _uploadsFolder; 
      } 
      set 
      { 
       _uploadsFolder = value; 
      } 

     } 
     private string _uploadsFolder = HostingEnvironment.MapPath("~/assets/uploads/temp"); 

     public string SaveUploadedFile(HttpPostedFileBase fileBase) 
     { 
      int lastPeriod = fileBase.FileName.LastIndexOf("."); 
      string fileExtension = ""; 
      if (lastPeriod != -1) 
      { 
       fileExtension = fileBase.FileName.Substring(lastPeriod); 
      } 

      var identifier = Guid.NewGuid(); 
      fileBase.SaveAs(GetDiskLocation(identifier, fileExtension)); 
      return identifier.ToString() + fileExtension; 
     } 

     private string GetDiskLocation(Guid identifier, string FileExtension) 
     { 
      return Path.Combine(UploadFolder, identifier.ToString() + FileExtension); 
     } 
    } 
} 

你會發現,當你創建DiskFileStore的實例,它把你想要的路徑將文件保存到。如果你沒有指定,它有一個默認的文件位置。該方法將返回一個帶有GUID和擴展名的字符串。

+0

這很有幫助,但是對於這種'FileStore'方法,我感到很奇怪。也許這只是一個命名的事情,把我扔掉。我最終只是用我的行爲方法中的兩行替換了原來的代碼。將來,當我通過拖放操作使我的應用中的上傳工作流更加健壯時,我會在後面回顧您的示例。謝謝!順便說一句swfupload是不適用於Windows認證,因爲閃光燈。 – Benjamin 2012-02-23 16:20:43

+0

FileStore允許您輕鬆更改要將文件保存到的位置。它可能是磁盤,數據庫,內存等。要使用SWFUpload,您需要允許匿名訪問任何處理上傳操作的操作。那只是使用Flash對象的限制。 – 2012-02-23 17:01:46