【问题标题】:Upload file to Windows Azure with only the link of the file is provided仅提供文件链接将文件上传到 Windows Azure
【发布时间】:2014-06-22 11:22:03
【问题描述】:

如果我只有要上传的文件的 URL,如何在 azure 中上传文件。在这种情况下,我使用 Dropbox file chooser 从 Dropbox 中选择文件并返回其 url 路径。 当量

https://www.dropbox.com/s/o9myet72y19iaan/Getting%20Started.pdf

现在我们需要将文件存储在 Windows Azure blob 中。在不先下载文件的情况下,最简单的方法是什么。 我打算使用 asp.net web api 将文件上传到 azure blob。

【问题讨论】:

    标签: javascript azure dropbox azure-storage dropbox-api


    【解决方案1】:

    起初,我认为这应该很简单,因为 Azure Blob 存储支持从外部 URL 复制 blob,但我认为这不适用于 Dropbox 文件。我刚试了一下,还是报错了。

    您上面提到的链接不是文件的直接链接。它是指向 Dropbox 网站上一个页面的链接,您可以从该页面下载文件。这显然是你不想要的。这是您可以尝试的替代解决方案:

    将 URL 中的 www.dropbox.com 替换为 dl.dropboxusercontent.com(基于以下 @smarx 的 cmets)并在以下代码中使用该 URL:

    首先,您需要将dl=1 作为查询字符串附加到您的请求 URL。因此,您的 Dropbox URL 将是 https://www.dropbox.com/s/o9myet72y19iaan/Getting%20Started.pdf?dl=1dl查询字符串参数表示需要下载的文件。

    接下来,使用HTTPWebRequest 尝试访问此 URL。 Dropbox 将回复另一个链接和302 状态码。此链接类似于https://dl.dropboxusercontent.com/s/o9myet72y19iaan/Getting%20Started.pdf?token_hash=<tokenhash>

    在下面的代码中使用这个链接来复制文件。这会起作用。

            CloudStorageAccount acc = new CloudStorageAccount(new StorageCredentials("account", "key"), false);
            var client = acc.CreateCloudBlobClient();
            var container = client.GetContainerReference("container-name");
            container.CreateIfNotExists();
            var blob = container.GetBlockBlobReference("dropbox-file-name");
            blob.StartCopyFromBlob(new Uri("dropbox URL with dl.dropboxusercontent.com"));
            Console.WriteLine("Copy request accepted");
            Console.WriteLine("Now checking for copy state");
            bool continueLoop = true;
            do
            {
                blob.FetchAttributes();
                var copyState = blob.CopyState;
                switch (copyState.Status)
                {
                    case CopyStatus.Pending:
                        Console.WriteLine("Copy is still pending. Will check status again after 1 second.");
                        System.Threading.Thread.Sleep(1000);//Copy is still pending...check after 1 second
                        break;
                    default:
                        Console.WriteLine("Terminating process with copy state = " + copyState.Status);
                        continueLoop = false;
                        break;
                }
            }
            while (continueLoop);
            Console.WriteLine("Press any key to continue.");
    

    【讨论】:

    • 不需要做重定向的事情。您可以将www.dropbox.com 替换为dl.dropboxusercontent.com。见dropbox.com/developers/blog/53/…
    • @Gaurav 我正在使用 asp.net web api - 我只需要创建一个 POST 方法并发布 url 吗?类似于 Task UploadPdf(string url) ?
    • 是的,这就是你要做的。感谢@smarx 的指针。我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-11-02
    • 2014-01-23
    • 2013-01-01
    • 1970-01-01
    • 2014-04-25
    • 2014-05-14
    • 2021-06-07
    • 2017-02-19
    相关资源
    最近更新 更多