从Razor Page上传文件至Azure文件共享的问题求助
解决Razor Page上传文件到Azure存储的问题及实现示例
错误原因说明
你遇到的CloudStorageAccount不存在的问题,是因为该类属于旧版Azure Storage SDK(Microsoft.Azure.Storage.*系列包),这类包在.NET Core 2.2环境下兼容性差,且微软已不再推荐使用。现在针对.NET Core环境,官方推荐使用新版的Azure.Storage.Blobs(Blob存储)和Azure.Storage.Files.Shares(文件共享)SDK,以下是完整实现步骤。
上传到Azure Blob存储的实现
1. 安装兼容的NuGet包
在Visual Studio的包管理器控制台执行:
Install-Package Azure.Storage.Blobs -Version 12.14.0
(注:12.14.0版本兼容.NET Core 2.2,更高版本仅支持.NET Core 3.1+)
2. 配置存储连接字符串
在appsettings.json中添加Azure存储账户的连接字符串:
{ "AzureStorage": { "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=你的存储账户名;AccountKey=你的存储账户密钥;EndpointSuffix=core.windows.net" } }
3. Razor Page后端代码(示例:UploadToBlob.cshtml.cs)
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Configuration; using Azure.Storage.Blobs; using System.IO; using System.Threading.Tasks; namespace YourProjectNamespace.Pages { public class UploadToBlobModel : PageModel { private readonly IConfiguration _config; public UploadToBlobModel(IConfiguration config) { _config = config; } [BindProperty] public IFormFile UploadedFile { get; set; } public async Task<IActionResult> OnPostAsync() { if (UploadedFile == null || UploadedFile.Length == 0) { ModelState.AddModelError("", "请选择要上传的文件"); return Page(); } // 获取连接字符串与容器名称 string connStr = _config["AzureStorage:ConnectionString"]; string containerName = "你的blob容器名"; // 需提前在Azure门户创建 // 初始化Blob客户端 BlobServiceClient blobServiceClient = new BlobServiceClient(connStr); BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(containerName); BlobClient blobClient = containerClient.GetBlobClient(UploadedFile.FileName); // 上传文件流 using (var stream = UploadedFile.OpenReadStream()) { await blobClient.UploadAsync(stream, overwrite: true); } return RedirectToPage("/UploadSuccess"); // 跳转至自定义成功页面 } } }
4. Razor Page前端代码(UploadToBlob.cshtml)
@page @model YourProjectNamespace.Pages.UploadToBlobModel <h1>上传文件到Azure Blob存储</h1> <form method="post" enctype="multipart/form-data"> <div class="form-group"> <label>选择文件</label> <input type="file" asp-for="UploadedFile" class="form-control" /> <span asp-validation-for="UploadedFile" class="text-danger"></span> </div> <button type="submit" class="btn btn-primary">开始上传</button> </form>
上传到Azure文件共享的实现
1. 安装兼容的NuGet包
在包管理器控制台执行:
Install-Package Azure.Storage.Files.Shares -Version 12.12.0
2. 配置连接字符串
复用上述appsettings.json中的AzureStorage:ConnectionString配置即可。
3. Razor Page后端代码(示例:UploadToFileShare.cshtml.cs)
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Configuration; using Azure.Storage.Files.Shares; using System.IO; using System.Threading.Tasks; namespace YourProjectNamespace.Pages { public class UploadToFileShareModel : PageModel { private readonly IConfiguration _config; public UploadToFileShareModel(IConfiguration config) { _config = config; } [BindProperty] public IFormFile UploadedFile { get; set; } public async Task<IActionResult> OnPostAsync() { if (UploadedFile == null || UploadedFile.Length == 0) { ModelState.AddModelError("", "请选择要上传的文件"); return Page(); } string connStr = _config["AzureStorage:ConnectionString"]; string shareName = "你的文件共享名"; // 需提前在Azure门户创建 string directoryName = "uploaded-files"; // 可选,自动创建不存在的目录 // 初始化文件共享客户端 ShareServiceClient shareServiceClient = new ShareServiceClient(connStr); ShareClient shareClient = shareServiceClient.GetShareClient(shareName); ShareDirectoryClient directoryClient = shareClient.GetDirectoryClient(directoryName); await directoryClient.CreateIfNotExistsAsync(); // 上传文件 ShareFileClient fileClient = directoryClient.GetFileClient(UploadedFile.FileName); using (var stream = UploadedFile.OpenReadStream()) { await fileClient.UploadAsync(stream, overwrite: true); } return RedirectToPage("/UploadSuccess"); } } }
4. Razor Page前端代码(UploadToFileShare.cshtml)
@page @model YourProjectNamespace.Pages.UploadToFileShareModel <h1>上传文件到Azure文件共享</h1> <form method="post" enctype="multipart/form-data"> <div class="form-group"> <label>选择文件</label> <input type="file" asp-for="UploadedFile" class="form-control" /> <span asp-validation-for="UploadedFile" class="text-danger"></span> </div> <button type="submit" class="btn btn-primary">开始上传</button> </form>
注意事项
- 确保Azure存储账户已提前创建对应的Blob容器或文件共享
- 若上传大文件,可参考官方文档实现分块上传逻辑
- 测试时需保证应用能正常访问Azure存储服务(防火墙规则需允许)
内容的提问来源于stack exchange,提问作者Michael 7
相关产品推荐
相关产品推荐

