将图像上传到 Azure Blob 存储 - 在本地工作,部署时失败

Uplod images to azure blob storage - Works locally, fails when deployed

我正在使用 ASPNetBoilerplate 作为基础框架,使用 .Net Core 模板,我正在尝试将照片上传到 blob 存储。 该站点托管在 Azure Web 应用程序中,Blob 存储在同一订阅中。

我正在使用下面的代码,当我在调试模式下在本地 运行 它时,它可以工作,但是一旦我将它部署到 Azure,我就会收到无法定位文件 D 的错误: \public\images\

任何人都可以看到我对 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;
    }

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

那是因为您的应用现在部署在云端,路径配置不正确。您可以尝试以下步骤-

  • 转到您订阅的资源和select您部署应用程序的应用程序服务。
  • 在开发工具下,select 高级工具,然后单击开始。这会将您带到部署您的应用程序的伪硬盘驱动器。

  • 在调试控制台下,select CMD。

  • 它将如下所示。 Create/put 您的文件位于适当的路径并使用该路径。