部署后无法访问ASP.NET MVC上载的图像文件夹
我可以在开发服务器上直接导航到此图像并显示它部署后无法访问ASP.NET MVC上载的图像文件夹,asp.net,asp.net-mvc,asp.net-mvc-3,deployment,asp.net-mvc-routing,Asp.net,Asp.net Mvc,Asp.net Mvc 3,Deployment,Asp.net Mvc Routing,我可以在开发服务器上直接导航到此图像并显示它 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
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-因为上载文件夹及其内容未复制到部署的应用程序文件夹中。路径不存在。我想我认为这不会是一个问题,因为应用程序的数据库不是一个问题
关于mime类型,我还有第二个问题,因为这些jpeg上没有扩展,只有来自swfupload的guid名称。我在IIS中为
创建了一个mime类型,即image/jpeg
,并显示图像。我想我应该把扩展名添加到文件名中。因为我在使用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" };
}
以及我的IDiskStore类:
using System;
using System.Web;
namespace CAA.Utility.IO
{
public interface IFileStore
{
string SaveUploadedFile(HttpPostedFileBase fileBase);
}
}
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和扩展名的字符串。您不想保留文件扩展名的原因是什么?我问这个问题是因为mime类型catch all for image/jpeg并不理想。我只是想知道是否有特定的原因,或者是什么原因导致你不得不这样做。@Splash-X我同意,这听起来像是一场即将发生的灾难。这些文件没有扩展名,因为我不知道如何从我正在关注的swfupload的在线示例中获取它。我宁愿保留扩展,而放弃变通方法。我还需要学习swfupload和.net文件处理,因为我对这方面还不熟悉。请查看我发布的答案,它提供了一些方法示例,可以从swfupload接收文件集合(如果使用多重上载)并传回文件名。碰巧我的代码返回一个字符串,该字符串是一个具有文件扩展名的GUID。我想这可能会为您节省一些时间。这很有帮助,但我觉得这种
FileStore
方法有些奇怪。也许这只是一个让我讨厌的命名问题。最后,我在action方法中用两行代码替换了原来的代码。将来,当我使用拖放功能使我的应用程序中的上载工作流更加健壮时,我将在这里引用您的示例。谢谢顺便说一句,由于闪存的原因,swfupload不适用于windows身份验证。文件存储允许您轻松更改文件的保存位置。它可以是一个磁盘、一个数据库、内存等。要使用SWFUpload,您需要允许匿名访问处理您上传的任何操作。这只是使用Flash对象的一个限制。