我在ASP.NET MVC3项目中为上传文件编写了一些代码。我没有将文件存储在数据库中,而是将文件上传到文件系统中并将路径存储在数据库中。
上传代码如下: -
if (file != null && file.ContentLength > 0)
{
if (path == null)
{
throw new ArgumentNullException("path cannot be null");
}
string pFileName = PrefixFName(file.FileName);
String relpath = String.Format("{0}/{1}", path, pFileName);
try
{
file.SaveAs(Server.MapPath(relpath));
return pFileName;
}
catch (HttpException e)
{
throw new ApplicationException("Cannot save uploaded file", e);
}
}
保存文件后,我在几个视图中使用了带有图像标记的图像。我的代码在本地工作正常。但是当我在windowsazure.com上托管该网站时,一切正常,但文件上传。
我怎样摆脱这种情况?请帮忙。
答案 0 :(得分:7)
在尝试保存文件之前需要注意的一件事是确保您要保存文件的目录存在。这是一个代码片段,用于确保在目标服务器上创建目标目录。
var path= Server.MapPath("~/ImagesDirectory");
if (!System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
您可能希望将其包装为try / catch以确保您的应用程序具有在该位置编写和创建目录的NTFS权限。另外,请确保您的path
变量呈现出您认为应该是的路径。
此外,如果VS项目中存在该目录,但其中没有任何内容,则编译器将不会创建该目录。要确保在上载项目时创建目录,请将空文本文件(例如“_doNotDelete.txt”)插入该目录,并将其构建操作设置为内容。这将确保在您发布时创建目录。
答案 1 :(得分:3)
首先,您不应该在临时操作旁边使用Web应用程序的文件夹。由于Azure意味着多计算机环境,如果您使用多个实例(机器),资源(图像)将无法供请求者使用
假设您上传了实例A的本地,实例B的本地将没有该文件,并且从DB检索路径不会更改实例B的任何内容。您永远不会知道哪个实例将响应请求。 (好吧,你可以,但它超出了这里的范围)但最后你必须意识到你的上传请求可能会转到实例A而你的显示请求可能会转到实例B能够检索。
无论如何,最好的做法是直接使用blob,它们的全部目的就是这个。您可以在http://www.windowsazure.com/en-us/documentation/articles/storage-dotnet-how-to-use-blobs-20/
上找到更多详细信息但是如果你坚持使用本地路径并且没有丢失文件的问题(是的,它会发生)使用Server.MapPath("~/App_Data/...")