如果我只有要上传的文件的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。
答案 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=1
。 dl
查询字符串参数表示需要下载文件。
接下来,使用 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.");