Azure Blob存储 - 使用文件流/内存流显示PDF

4
我已经建立了一个Azure Blob Storage以上传/下载文件。请参考此链接配置您的存储连接字符串。
ProcessAsync(Folderpath, rows.Item("FileName"), rows.Item("Extension")).GetAwaiter().GetResult()
System.IO.File.Move(Folderpath + "\" + rows.Item("FileName"), AchivePath + "\" + rows.Item("FileName"))
WriteToLog("Extracted File : " + rows.Item("FileName") + " ", "")
DownloadBlobSnapshot(rows.Item("FileName"), rows.Item("Extension")).GetAwaiter().GetResult()

目前,我能够将文件存储在我的桌面上。如何使用 .net MVC 平台和 UsingMemoryStream/FileStream 将文件保存并显示出来?

或者,是否有更好的方法来完成这个任务?

编辑 1:(基于 Ivan 的答案)

Private Shared Async Function DownloadBlobSnapshot(FileName As String, Extension As String) As Task

Dim storageAccount As CloudStorageAccount
Dim storageConnectionString As String = ConfigurationManager.AppSettings("StorageConnectionString")
Dim accountName As String = myaccountname
Dim accountKey As String = myaccountkey
Dim cred = New StorageCredentials(accountName, accountKey)
Dim account = New CloudStorageAccount(cred, True)
Dim client = account.CreateCloudBlobClient()
Dim container = client.GetContainerReference(FileName.Replace(Extension, ""))
Dim listOfBlobs As IEnumerable = container.ListBlobs(Nothing, True, BlobListingDetails.Snapshots)

If CloudStorageAccount.TryParse(storageConnectionString, storageAccount) Then
   For Each item In listOfBlobs
       Dim blockBlob As CloudBlockBlob = container.GetBlockBlobReference((CType(item, CloudBlockBlob)).Name)
       blockBlob.DownloadToStream(Response.OutputStream)
   Next
       //ToDO
        End If
End Function

但是我意识到ResponseShared函数中不可用。


只是想澄清一下,您想在MVC页面中显示.pdf文件吗?您的.pdf文件是存储在本地还是Blob存储中? - Ivan Glasenberg
@IvanYang 是的。我先将它存储在本地,然后上传到 Blob 存储中。之后,我通过下载相同的文件并将其存储在不同的文件夹中来测试它。 - PartTimeNerd
我想知道,如果你想要在MVC页面中显示存储在Blob存储中的.pdf文件,对吗? - Ivan Glasenberg
@IvanYang,没错。 - PartTimeNerd
如果使用DownloadToStream方法,那应该很容易,你可以参考我下面的回答。一分钟后。 - Ivan Glasenberg
请告诉我是否有任何问题 :) - Ivan Glasenberg
2个回答

5
你可以使用 DownloadToStream
以下是示例代码(asp.net mvc项目):
        public ActionResult DownloadFile()
        {
            CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials("your_account", "your_key"),true);
            CloudBlobClient client = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer blobContainer = client.GetContainerReference("t11");
            CloudBlockBlob blob = blobContainer.GetBlockBlobReference("ss22.pdf");

            blob.DownloadToStream(Response.OutputStream);

            return new EmptyResult();
        }

更新1:上传vb.net mvc项目的截图:在此输入图片描述


这是一个vb.net项目吗?我不熟悉:(。但是你是否创建了一个vb.net mvc项目并在xxxcontroller.vb中编写代码?我创建了一个vb.net mvc项目,响应正常。稍后,我会在我的答案中添加截图。 - Ivan Glasenberg
可能是因为我的方法声明问题,似乎我们不能在“shared”方法中使用“Response”。 - PartTimeNerd
不确定,因为我不熟悉vb,如果是c#,我可以进行更多的调查 :)。 - Ivan Glasenberg

5
如果你遇到了和我一样的问题,请看这里。
Function DownloadBlobSnapshot(FileName As String, Extension As String) As ActionResult

    Dim storageAccount As CloudStorageAccount
    Dim storageConnectionString As String = ConfigurationManager.AppSettings("StorageConnectionString")
    Dim accountName As String = myaccountname
    Dim accountKey As String = myaccountkey
    Dim cred = New StorageCredentials(accountName, accountKey)
    Dim account = New CloudStorageAccount(cred, True)
    Dim client = account.CreateCloudBlobClient()
    Dim container = client.GetContainerReference("myfilename")
    Dim fileStream As New MemoryStream
    fileStream.Position = 0
    Dim listOfBlobs As IEnumerable = container.ListBlobs(Nothing, True, BlobListingDetails.Snapshots)

    Try
        If CloudStorageAccount.TryParse(storageConnectionString, storageAccount) Then
            For Each item In listOfBlobs
                Dim blockBlob As CloudBlockBlob = container.GetBlockBlobReference((CType(item, CloudBlockBlob)).Name)
                blockBlob.DownloadToStream(fileStream)
                Response.Clear()
                Response.ContentType = "application/force-download"
                Response.AddHeader("content-disposition", "inline; filename=name_you_file.pdf")
                Response.BinaryWrite(fileStream.ToArray)
                Response.End()

                Return New FileStreamResult(fileStream, "application/pdf")

            Next

        End If
    Catch ex As Exception

    End Try

End Function

更新日期:2018年11月29日

Function DownloadBlobSnapshot(FilePath As String, LabCompany As String, FileName As String) As ActionResult

    Dim storageAccount As CloudStorageAccount
    Dim cloudBlobContainer As CloudBlobContainer = Nothing
    Dim sourceFile As String = Nothing
    Dim destinationFile As String = Nothing
    Dim storageConnectionString As String = (CASAuthentication.Decrypt(Configs.BlobConnectionString))
    Dim url As String = ""
    Dim sasToken As String = ""

    If CloudStorageAccount.TryParse(storageConnectionString, storageAccount) Then
        Try

            Dim cloudBlobClient As CloudBlobClient = storageAccount.CreateCloudBlobClient()

            cloudBlobContainer = cloudBlobClient.GetContainerReference(LabCompany.ToLower)
            If cloudBlobContainer.Exists() Then
                Dim cloudBlockBlob As CloudBlockBlob = cloudBlobContainer.GetBlockBlobReference((FileName))
                If cloudBlockBlob.Exists Then
                    url = cloudBlockBlob.Uri.AbsoluteUri()

                    Dim sharedPolicy As SharedAccessBlobPolicy = New SharedAccessBlobPolicy() With {
            .SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(Integer.Parse(ConfigurationManager.AppSettings("PDFTimeOut"))),
            .Permissions = SharedAccessBlobPermissions.Read Or SharedAccessBlobPermissions.Write
        }

                    sasToken = cloudBlockBlob.GetSharedAccessSignature(sharedPolicy)

                End If
            End If

                Return Json(New With {.success = True, .url = url + sasToken}, JsonRequestBehavior.AllowGet)

        Catch ex As Exception
            Return Json(New With {.success = False, .message = ex.ToString}, JsonRequestBehavior.AllowGet)
        Finally

        End Try

    Else
        Return Json(New With {.success = False, .message = "Failed to receive report data. Please try again later."}, JsonRequestBehavior.AllowGet)
    End If

End Function

使用ajax显示

var tabledata =  {mydata: data}
    $.ajax({
        cache: false,
        type: "POST",
        url: "/Home/DownloadBlobSnapshot",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(tabledata),
        success: function (result) {
            var e = result.url
            //e.substr(0, e.lastIndexOf("/"))
            e = "http://docs.google.com/viewer?url=" + encodeURIComponent(e) + "&embedded=true";
            popitup(e);
        },

        error: function () {

        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接