【问题标题】:Azure Blob Storage StartCopy with source pointing to Cloud Convert源指向 Cloud Convert 的 Azure Blob 存储 StartCopy
【发布时间】:2017-01-16 13:52:52
【问题描述】:

我有 Cloud Convert 转换视频,当它完成时,我告诉 Azure BLOB 存储从它的转换输出 URL 下载文件,使用方法 CloudBlockBlob.StartCopyAsync

我必须说,这曾经有效。在此过程开始失败之前,我没有更改任何一行代码。

现在,只要 Azure 尝试从 Cloud Convert 下载,它就会失败并显示消息 500 InternalServerError "Copy failed."。如果我在浏览器中复制下载 URL,它会正常下载文件。该过程适用于存储模拟器。

我的问题是,还有其他人有同样的问题吗?我该如何解决?我需要自己下载文件并将其上传到 Azure Blob 存储吗?

【问题讨论】:

  • 你能通过像 Fiddler 这样的工具来追踪请求/响应吗?可以分享一个我们可以尝试的网址吗?
  • @GauravMantri Azure 存储是一项服务。我无权访问服务器。我可以用模拟器来做,但是模拟器可以工作。我可以向您发送我正在尝试下载的文件的 URL,但似乎来自 cloud convert 的任何输出 URL 都会产生相同的结果。
  • 你能把网址发给我吗?我会尝试模拟相同的。
  • @GauravMantri host123d1qj.cloudconvert.com/download/… 它也适用于 HTTP
  • 我能够成功执行复制操作,但是我注意到 blob 的文件大小为 0 字节。经过进一步检查,我发现您共享的链接设置了 Content-Disposition 属性。您可以尝试删除源文件中的Content-Disposition 属性值吗?

标签: azure azure-storage azure-blob-storage internal-server-error


【解决方案1】:

您是否考虑过使用 Azure 存储数据移动库:Git Docs。具体来说,请参阅 TransferManager.CopyAsync()。要研究的另一件事是更改目标容器的访问类型。

【讨论】:

    【解决方案2】:

    但是,一旦我检查 CopyState,它就会显示它失败并显示消息 InternalServerError "Copy failed."。

    在我这边测试期间,我没有遇到这个错误。请尝试调试您的代码并捕获详细错误,以查看此错误是在您的代码中还是在服务器端抛出的。

    我必须说,这曾经有效。在此过程开始失败之前,我没有更改任何一行代码。

    根据您的描述,我在 Cloud Convert 中注册了一个帐户,并将 .pdf 文件转换为 .docx 文件。然后我对它进行了测试,得到的结果与 Gaurav 所说的可以成功创建 blob 但 blob 的大小为 0 字节的结果相同。我认为 Cloud Convert 可能会进行一些调整。由于您可以在浏览器中下载文件,因此您可以按照以下代码作为替代方法来实现您的目的。

    //pdf-to-docx.docx
    url = "https://host123d1qm.cloudconvert.com/download/~7-9EyBedLQQyCoh41ONW6h1RpFY";
    using (HttpClient client = new HttpClient())
    {   
        //download the file via the URL provided by CloudConvert
        var response = await client.GetAsync(url);
        //define the block blob object
        string filename = response.Content.Headers.ContentDisposition.FileName.Trim(new char[] { '"' });
        string contentType = response.Content.Headers.ContentType.ToString();
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(filename);
        blockBlob.Properties.ContentType = contentType;
        //upload blob
        await blockBlob.UploadFromStreamAsync(await response.Content.ReadAsStreamAsync());
    }
    

    【讨论】:

    • 我想你误会了我。我正在使用端点启动文件的异步副本。我在 SDK 中调用 StartCopy 方法,它会在 azure 收到请求后立即返回(或可以返回),但在复制完成之前(msdn.microsoft.com/en-us/library/azure/dd894037.aspx)。我也转换了视频,但我认为文件的类型没有任何改变。现在,在 .NET SDK 中,blob 中有一个名为 CopyState 的属性,它指示了副本的状态。我收到的信息来自那里。如果某处有更好的信息,我不知道。
    • 我可以让它像你的例子一样工作。我在另一个不使用 Azure 的项目中这样做了。但由于我使用 azure,我希望存储为我下载文件。如果可以避免,我不希望视频通过我的服务器。
    猜你喜欢
    • 2021-06-10
    • 2019-04-03
    • 2017-11-10
    • 2015-11-11
    • 2012-03-02
    • 2016-03-04
    • 2021-05-31
    • 2021-07-09
    • 2015-03-26
    相关资源
    最近更新 更多