我有一个带有图片上传的注册表单,当我在Windows Azure服务器上传我的包应用程序时它不起作用。
服务器中的图像地址如下所示:
F:\sitesroot\0\Uploads\Users\9259826_2121813246965_1294840438_2490950_6619588_n.jpg
如果我有这样的图像网址,那就是它的相对路径:
http://dealma.cloudapp.net/Uploads/Users/9259826_2121813246965_1294840438_2490950_6619588_n.jpg
我已经解决了这个问题。
我用来上传的当前代码是:
if (userImg != null && userImg.ContentLength > 0)
{
try
{
var fileName = Url.Encode(userImg.FileName);
//no overwrite files
var pathToCheck = Server.MapPath("~/Uploads/Users/" + fileName);
var savePath = Server.MapPath("~/Uploads/Users/");
var tempfileName = fileName;
int counter = 2;
while (System.IO.File.Exists(pathToCheck))
{
tempfileName = counter.ToString() + fileName;
pathToCheck = savePath + tempfileName;
counter++;
}
fileName = tempfileName;
var finalImg = Path.Combine(savePath, fileName);
userImg.SaveAs(finalImg);
//Img name
userSet.Picture = finalImg;
userSet.Thumbnail = finalImg;
}
catch (Exception ex)
{
Response.Write("Não foi possível fazer upload do arquivo: " + ex.Message);
}
}
有谁知道如何解决这个问题?
答案 0 :(得分:6)
正如乌鸦所说,你正在写信给本地存储"它是易失性的,不会在虚拟机的多个实例之间共享。
Blob存储允许您存储任意文件,图像等。每个项目都存储在自己的blob中。你也有一个"容器"的概念。 - 将其视为顶级目录文件夹。没有嵌套容器,但您可以使用名称中的路径字符来模拟它们(现在跳过此处,因为您需要快速解决方案)。
如果您下载Windows Azure Platform Training Kit并查看实验室"云服务简介",它会显示一个留言簿应用程序,其中照片会上传到blob存储。您将看到如何设置存储帐户,以及编写代码以将文件推送到blob而不是本地文件系统。这是样本中的一个片段:
初始化blob客户端,并设置容器来存储文件:
var storageAccount =
CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
// create blob container for images
blobStorage = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobStorage.GetContainerReference("uploads");
container.CreateIfNotExist();
现在,在您的上传处理程序中,您将写入blob而不是本地文件系统:
string uniqueBlobName = string.Format("uploads/image_{0}{1}",
Guid.NewGuid(), Path.GetExtension(UserImg.FileName));
CloudBlockBlob blob = blobStorage.GetBlockBlobReference(uniqueBlobName);
blob.Properties.ContentType = UserImg.PostedFile.ContentType;
// note: there are several blob upload methods -
// choose the best one that fits your app
blob.UploadFromStream(UserImg.FileContent);
下载平台培训套件后,您将看到完整的工作示例。
答案 1 :(得分:1)
您正尝试将图像保存到处理请求的Web角色所在的虚拟机。
您的应用程序中可能有多个Web角色实例。因此,文件保存在一台计算机上,但下一个请求由另一个没有此文件的Web角色和虚拟机提供。
因此,好主意是将需要从任何Web角色访问的所有数据保存到blob。如果您有一些静态数据,则可以将此数据放入包含Web角色的包中。所有其他数据应该驻留在blob中。
如果您不想修改应用程序的代码,可以将blob存储的一部分映射为另一个硬盘驱动器到Web角色的每个实例。在这种情况下,您只需要将接收到的数据写入此映射磁盘。可以从任何Web角色访问结果。