我有一个ASP.NET MVC 4应用程序,我想部署到Windows Azure。此应用的一部分涉及上传图片。上传图片时,我想将图片存储在/pictures/uploaded
的目录中。
我的问题是,如何将图片上传到我在Windows Azure上托管的应用中的相对路径?到目前为止,我的应用程序已托管在虚拟机中。我能够通过以下方式完成上述工作:
string path = ConfigurationManager.AppSettings["rootWebDirectory"] + "/pictures/uploaded;
// Get the file path
if (Directory.Exists(path) == false)
Directory.CreateDirectory(path);
string filePath = path + "/uploaded" + DateTime.UtcNow.Milliseconds + ".png";
filePath = filePath.Replace("/", "\\").Replace("\\\\", "\\");
// Write the picture to the file system
byte[] bytes = GetPictureBytes();
using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
{
fileStream.Write(bytes, 0, bytes.Length);
fileStream.Flush();
fileStream.Close();
}
目前,ConfigurationManager.AppSettings["rootWebDirectory"]
指向绝对路径。我相信这是我的问题所在。我无法弄清楚如何将所有这些切换到相对路径。
谢谢!
答案 0 :(得分:19)
这是我的简单描述如何在天蓝色中设置它。 http://geekswithblogs.net/MagnusKarlsson/archive/2012/12/02/how-to-use-azure-storage-for-images.aspx
//编辑;继承了我博客的完整示例(如果博客死了)。 yourViewName.cshtml
@model List<string>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<form action="@Url.Action("Upload")" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file1" />
<br />
<label for="file">Filename:</label>
<input type="file" name="file" id="file2" />
<br />
<label for="file">Filename:</label>
<input type="file" name="file" id="file3" />
<br />
<label for="file">Filename:</label>
<input type="file" name="file" id="file4" />
<br />
<input type="submit" value="Submit" />
</form>
@foreach (var item in Model) {
<img src="@item" alt="Alternate text"/>
}
您的控制器操作
public ActionResult Upload(IEnumerable<HttpPostedFileBase> file)
{
BlobHandler bh = new BlobHandler("containername");
bh.Upload(file);
var blobUris=bh.GetBlobs();
return RedirectToAction("Index",blobUris);
}
你的模特
public class BlobHandler
{
// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
private string imageDirecoryUrl;
/// <summary>
/// Receives the users Id for where the pictures are and creates
/// a blob storage with that name if it does not exist.
/// </summary>
/// <param name="imageDirecoryUrl"></param>
public BlobHandler(string imageDirecoryUrl)
{
this.imageDirecoryUrl = imageDirecoryUrl;
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve a reference to a container.
CloudBlobContainer container = blobClient.GetContainerReference(imageDirecoryUrl);
// Create the container if it doesn't already exist.
container.CreateIfNotExists();
//Make available to everyone
container.SetPermissions(
new BlobContainerPermissions
{
PublicAccess = BlobContainerPublicAccessType.Blob
});
}
public void Upload(IEnumerable<HttpPostedFileBase> file)
{
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve a reference to a container.
CloudBlobContainer container = blobClient.GetContainerReference(imageDirecoryUrl);
if (file != null)
{
foreach (var f in file)
{
if (f != null)
{
CloudBlockBlob blockBlob = container.GetBlockBlobReference(f.FileName);
blockBlob.UploadFromStream(f.InputStream);
}
}
}
}
public List<string> GetBlobs()
{
// Create the blob client.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference(imageDirecoryUrl);
List<string> blobs = new List<string>();
// Loop over blobs within the container and output the URI to each of them
foreach (var blobItem in container.ListBlobs())
blobs.Add(blobItem.Uri.ToString());
return blobs;
}
}
答案 1 :(得分:10)
数据和图片不应存储在网站目录中。这就是为什么有Azure Blob Storage。
Azure通过将网站复制到实例来工作,因此如果存在多个实例,则上传的图像(存储在本地实例中)将变得不同步,如果存在冲突,您甚至会丢失图像。 / p>
如果你真的想这样做,下面的一行会给你你想要的东西:
string path = Server.MapPath("~/pictures/uploaded");
答案 2 :(得分:3)
这里有一些很好的答案可以告诉你如何做你需要的。如果你不介意,请允许我提出一个替代方案。
就个人而言,为了解决你的问题,我转向Azure Blob Storage。 Blob存储是一种非常便宜且快速的方法,用于存储与您的云服务当前运行的VM完全分离的二进制文件(在文件夹类型结构中)。
在迁移或针对现有应用程序进行迁移时,这将为您提供额外的自由,因为您不必随每个部署一起迁移上载。 Blob存储文件也可以跨多个Azure数据中心进行三重复制,无需额外成本,并且比部署VM具有更强的容错能力。
移动到Blob存储还允许您在站点脱机或VM关闭时访问您的文件。
您不再在共享计算领域运营,其中所有资源必须存在于同一台计算机上。 Azure是为可扩展性和资源分离而构建的。 Blob存储专门针对您在此处尝试的内容而设计。
答案 3 :(得分:-1)
string path = HostingEnvironment.MapPath(@"~/pictures/uploaded");