使用 UploadFromFile 将文件上传到 Azure
Posted
技术标签:
【中文标题】使用 UploadFromFile 将文件上传到 Azure【英文标题】:Uploading a file to Azure using UploadFromFile 【发布时间】:2017-08-17 00:01:56 【问题描述】:我有一个 ASP.NET Web 窗体应用程序。
在我的一个表单中,我正在从 Azure 下载 PDF,它使用 rasteredge(PDF 查看器)显示,这允许我在 PDF 上添加和保存注释。
然后将带有注释的文件保存在我的应用程序根目录 (RasterEdge_Cache) 的文件夹中。 我想使用 UploadFromFile 函数将 PDF 上传回 Azure。
这是我正在使用的功能:
public static void UploadFile(DTO.BlobUpload b)
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["SN_ZEUXYS"]);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(b.Container);
CloudBlockBlob blockBlob = container.GetBlockBlobReference(b.FileName);
// b.FilePath = "~/RasterEdge_Cache/193304798925/output/A-0002-00008-00205Anno.pdf"
blockBlob.UploadFromFile(b.FilePath);
这是我收到的错误消息:
发生“System.IO.DirectoryNotFoundException”类型的异常 在 mscorlib.dll 中,但未在用户代码中处理 信息:找不到路径“C:\Program Files”的一部分 (x86)\IIS Express\~\RasterEdge_Cache\193304798925\output\A-0002-00008-00205Anno.pdf'。
我假设文件路径不正确,我应该使用什么路径,或者我是否正确使用了 UploadFromFile?
感谢您的帮助。
【问题讨论】:
【参考方案1】:您的文件路径是一个相对路径,因此您应该指定它的确切位置。考虑使用Server.MapPath 方法来找出它到服务器上应用程序根目录的物理路径。
HttpContext httpContext = HttpContext.Current;
HttpServerUtility server = httpContext.Server;
b.FilePath = server.MapPath("~/RasterEdge_Cache/193304798925/X.pdf")
【讨论】:
嗨,我仍然有一条错误消息,但看起来该文件已通过 server.MapPath 找到。现在这是我的错误。 Microsoft.WindowsAzure.Storage.dll 中出现“Microsoft.WindowsAzure.Storage.StorageException”类型的异常,但未在用户代码中处理附加信息:远程服务器返回错误:(404) 未找到。所以问题是,我是否使用了正确的函数:UploadFromFile? blockBlob.UploadFromFile(b.FilePath);或者我应该使用另一个函数,我应该使用什么函数以及如何使用。 这似乎是一个配置问题。请将您的 Azure 配置添加到您的问题中。 (考虑隐藏敏感信息。) 我不认为这是 Azure 配置问题,因为我使用此配置将文件流式传输回同一存储。这是我的网络配置中的应用程序密钥:【参考方案2】:Microsoft.WindowsAzure.Storage.dll 中出现“Microsoft.WindowsAzure.Storage.StorageException”类型的异常,但未在用户代码中处理附加信息:远程服务器返回错误:(404) 未找到。所以问题是,我是否使用了正确的函数:UploadFromFile? blockBlob.UploadFromFile(b.FilePath);
根据这个article,“远程服务器返回错误:(404)未找到。”当针对容器的上传操作因找不到容器或 blob 而失败时发生。
所以我建议你可以先检查“b.Container,b.FileName”的值是否存在,或者你可以使用 CreateIfNotExists 方法。
更多细节,你可以参考下面的代码。希望它能给你一些提示。
protected void Button5_Click(object sender, EventArgs e)
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("connection string");
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
//check the b.Container value is right and exists
CloudBlobContainer container = blobClient.GetContainerReference("foobar");
CloudBlockBlob blockBlob = container.GetBlockBlobReference("TestFile.pdf");
HttpContext httpContext = HttpContext.Current;
HttpServerUtility server = httpContext.Server;
string FilePath = server.MapPath("~/test/TestFile.pdf");
//by using this code will create the container if not exists
container.CreateIfNotExists();
blockBlob.UploadFromFile(FilePath);
【讨论】:
以上是关于使用 UploadFromFile 将文件上传到 Azure的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AngularJS 将文件上传到 Google Drive
如何使用nestJS将文件上传到mongoose上的mongodb?
在邮递员中使用 php curl 将文件上传到 Nextcloud 但上传的文件为空