将映像上传到Azure Blob存储-本地工作,部署后失败

时间:2018-06-21 11:43:23

标签: c# azure aspnetboilerplate

我正在使用ASPNetBoilerplate作为基本框架,并使用.Net Core模板,并且尝试将照片上传到Blob存储。  该网站托管在Azure Web App中,并且Blob存储在同一订阅中。

我正在使用以下代码,当我在调试模式下本地运行它时,它可以工作,但是一旦将其部署到Azure时,我收到一个无法找到文件D:\ public \ images \ <的错误。 / p>

任何人都可以看到我对于azure部署所做的不正确的操作,或者为什么它可以在本地运行但不能在Azure中运行。

我正在尝试从guid生成上传的文件名,将图像上传到azure,然后将生成的文件名存储到sql数据库中。

任何帮助或建议将不胜感激。

 public async Task<ICollection<BlogImage>> UploadFileAsync(ICollection<IFormFile> files, string RecordType,  int id) {
        ICollection<BlogImage> _blogImages = new Collection<BlogImage>();


         string imageFullPath = null;
        if (files == null || files.Count == 0)
        {
             await Task.FromException(new Exception("No File Supplied"));
        }
        try
        {
            //Connect To Azure
            CloudStorageAccount cloudStorageAccount = GetAuth();

            //Create a refernce to blob client
            CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();

            //Create a reference to the container
            CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference("images");

            if (await cloudBlobContainer.CreateIfNotExistsAsync())
            {
                await cloudBlobContainer.SetPermissionsAsync(
                    new BlobContainerPermissions
                    {
                        PublicAccess = BlobContainerPublicAccessType.Blob
                    }
                );
            }

            foreach (var file in files)
            {

                string imageName = Guid.NewGuid().ToString() + Path.GetExtension(file.FileName);

                CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference(RecordType + "/" +id.ToString() + "/" + imageName);
                cloudBlockBlob.Properties.ContentType = file.ContentType;

                // Stream fileStream = File.OpenRead(file)
                Logger.Info("file name is: " + file.FileName + " Name is: " + file.Name + " Generated Name is: " + imageName);
                using (Stream fileStream = File.OpenRead(file.FileName))
                {
                    Logger.Info("File Opened;");

                    // Upload the file
                    await cloudBlockBlob.UploadFromStreamAsync(fileStream);
                    System.Drawing.Image image = System.Drawing.Image.FromStream(fileStream);

                    var im = new BlogImage { ImageName = imageName, Size = file.Length, ContentType = file.ContentType, Height = image.Height, Width = image.Width };
                    fileStream.Dispose();
                    _Images.Add(im);
                }

                imageFullPath = cloudBlockBlob.Uri.ToString();
            }
        }
        catch (Exception ex)
        {
            Logger.Error("Exception triggered: " + ex.Message);
            _telemetryClient.TrackException(ex);
        }
        return _Images;
    }

2 个答案:

答案 0 :(得分:0)

您使用File.OpenRead方法读取带有路径的文件流(该路径可能不存在-取决于您用来承载该应用程序的Azure服务)。但是,您可能应该对传递的OpenReadStream()使用IFormFile来获取流。

答案 1 :(得分:0)

这是因为您的应用程序现在已部署在云上,并且路径配置不正确。您可以尝试以下步骤-

  • 转到订阅下的资源,然后选择用于部署应用程序的应用程序服务。 enter image description here
  • 在“开发工具”下,选择“高级工具”,然后单击“执行”。这将带您到已部署应用程序的伪硬盘驱动器。

enter image description here

  • 在调试控制台下,选择CMD。

enter image description here

  • 如下所示。在适当的路径中创建/放置文件,然后使用该路径。

enter image description here