将图像保存到不在azure上工作的文件夹

时间:2014-12-10 23:37:40

标签: asp.net asp.net-mvc azure azure-sql-database azure-storage

我将图像文件保存到应用程序中的文件夹并将其路径保存在数据库中。当我在本地运行并且其路径也在存储时,图像上传工作正常。当我在azure上部署它时,它会给出错误"处理您的请求时发生错误"。我的数据库中有两个表。第一个保存文本的文件在azure上工作正常,但图像上传引发了此错误。

Text saved correctly

enter image description here enter image description here

我使用this代码上传图片,当我在本地运行时,它的工作正常。 需要帮助?

当我关闭海关错误模式时,会出现此错误

2 个答案:

答案 0 :(得分:2)

用于上传在Azure中无法使用的图片的代码。试想一下,如果扩展实例的nubmer,这应该如何工作。 您应该使用Azure blob存储来上载Azure中的文件。 你可以谷歌获得很好的教程,但长话短说你应该做到以下几点:

1.)在manage.windowsazure.com上创建Azure存储帐户

2.。)设置存储连接字符串(您可以从存储帐户获取AccountKey)

<configuration>
    <appSettings>
        <add key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=storagesample;AccountKey=nYV0gln9fT7bvY+rxu2iWAEyzPNITGkhM88J8HUoyofpK7C8fHcZc2kIZp6cKgYRUM74lHI84L50Iau1+9hPjB==" />
    </appSettings>
</configuration>

在你的代码中

3.)添加以下命名空间

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

4.)初始化存储连接

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

5。)创建容器,如果它已经存在

// Retrieve a reference to a container. 
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// Create the container if it doesn't already exist.
container.CreateIfNotExists();
container.SetPermissions(
    new BlobContainerPermissions { PublicAccess = 
    BlobContainerPublicAccessType.Blob }); 

6.。)指定对象名称

  

//检索对名为&#34; myblob&#34;的blob的引用。 CloudBlockBlob   blockBlob = container.GetBlockBlobReference(&#34; myblob&#34;);

7.。)上传fata

  

MemoryStream ms = new MemoryStream();
  图片img =   Image.FromStream(model.ImageUpload.InputStream);
  img.Save(ms,ImageFormat.Jpeg);

     

//创建或覆盖&#34; myblob&#34;含有内容的blob   文件。       blockBlob.UploadFromStream(ms.ToArray());

您链接的代码将如下所示:

  

[HttpPost] [ValidateAntiForgeryToken] public ActionResult   创建(ImageViewModel模型){       var validImageTypes = new string []       {           &#34;图像/ GIF&#34 ;,           &#34;图像/ JPEG&#34 ;,           &#34;图像/ PJPEG&#34 ;,           &#34;图像/ PNG&#34;       }

if (model.ImageUpload == null || model.ImageUpload.ContentLength == 0)
{
    ModelState.AddModelError("ImageUpload", "This field is required");
}
else if (!imageTypes.Contains(model.ImageUpload.ContentType))
{
    ModelState.AddModelError("ImageUpload", "Please choose either a GIF, JPG or PNG image.
}

if (ModelState.IsValid)
{
    var image = new Image
    {
        Title = model.Title,
        AltText = model.AltText,
        Caption = model.Caption
    }

    if (model.ImageUpload != null && model.ImageUpload.ContentLength > 0)
    {
     

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(       ConfigurationManager.ConnectionStrings [&#34; StorageConnectionString&#34]。ConnectionString中);       CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();   //检索对容器的引用。       CloudBlobContainer容器= blobClient.GetContainerReference(&#34;上传&#34;);

// Create the container if it doesn't already exist.
container.CreateIfNotExists();
container.SetPermissions(
    new BlobContainerPermissions { PublicAccess = 
    BlobContainerPublicAccessType.Blob }); 
  

blockBlob =   container.GetBlockBlobReference(model.ImageUpload.FileName);

        var imageUrl = blockBlob.Uri;
     

MemoryStream ms = new MemoryStream();
  图片img =   Image.FromStream(model.ImageUpload.InputStream);
  img.Save(ms,ImageFormat.Jpeg);

     

//创建或覆盖&#34; myblob&#34;含有内容的blob   文件。       blockBlob.UploadFromStream(ms.ToArray());               image.ImageUrl = imageUrl;           }

    db.Create(image);
    db.SaveChanges();
    return RedirectToAction("Index");
}

return View(model); }

答案 1 :(得分:0)

在Azure中,不允许写入本地物理路径。因此,您需要替换保存功能,以将位写入Azure Blob存储或任何其他相关存储系统等外部存储系统。

如果您要在实际保存之前寻找临时本地存储以进行快速处理,那么您可以使用Azure本地存储