使用 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

如何使用 NodeJS 将文件或图像上传到服务器

如何使用nestJS将文件上传到mongoose上的mongodb?

在邮递员中使用 php curl 将文件上传到 Nextcloud 但上传的文件为空

使用 jquery 文件上传将图像上传到 cloudinary 和我自己的服务器

使用 github 操作将 apk 文件上传到 Slack