将图像上传到 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 您的文件位于适当的路径并使用该路径。
我正在使用 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 您的文件位于适当的路径并使用该路径。