将文件上载到Windows Azure,仅提供文件的链接

时间:2014-05-06 01:40:00

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

如果我只有要上传的文件的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。

1 个答案:

答案 0 :(得分:1)

起初,我认为它应该非常简单,因为Azure Blob存储支持从外部URL复制blob但是我不认为这对Dropbox文件有用。我只是尝试了它,但即使有错误。

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

将您的网址中的www.dropbox.com替换为dl.dropboxusercontent.com(基于@ smarx'以下评论)并在以下代码中使用该网址:

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

接下来,使用HTTPWebRequest尝试访问此网址。 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.");