Azure Blob存储 - 从外部URL上传图像而不先下载图像

时间:2017-06-07 09:49:11

标签: cordova azure ionic-framework azure-storage image-uploading

我们目前正在迁移旧用户数据,这些数据存储在我们的某个专用服务器上,或者在离子移动应用程序本地存储到Azure(或两者)。我们已完成基本表格数据的迁移以及设备上的图像。我们遇到的问题是将图像从旧的专用服务器传输到Azure Blob存储,而不会在上传之前将图像下载到设备(由于数据使用问题)。

使用案例

1)用户登录更新的移动应用程序/网站。

2)用户数据在“同步”步骤中从旧服务器移动到Azure。

3)使用Azure生成的SAS查询字符串将所有本地映像上载到Azure blob。

4)所有本地不再存在的图像需要从专用服务器移动到azure blob存储

问题:

是否可以移动这些文件而不先将它们下载到设备然后上传它们。当前系统是VB.NET MVC应用程序。我看过Azure Blob Storage SDK的参考资料,但从我看到它只能作为C#库提供。

当前的想法:

1)构建一个C#应用程序,该应用程序使用Storage SDK将文件复制到blob存储。在这种情况下,不确定如何使用SAS查询字符串。另外如何监控上传的状态并转发回应用/网站?

2)首先将图像下载到设备,然后使用SAS查询字符串正常上传

非常感谢任何帮助或建议。谢谢你的时间。

1 个答案:

答案 0 :(得分:0)

  

是否可以移动这些文件而不先将它们下载到设备然后上传它们。当前系统是VB.NET MVC应用程序。我看过Azure Blob Storage SDK的参考资料,但从我看到它只能作为C#库提供。

据我所知,我们无法直接在blob存储中直接复制url而不先将其下载到设备然后再上传。

azure存储blob支持使用Copy Blob rest api command从另一个blob或文件内容复制服务器端。

azure SDK还执行StartCopy方法,该方法将使用Copy Blob rest api发送请求。所以我们不能直接在blob存储中直接复制url而不先将它们下载到设备然后上传它们。

  

首先将图像下载到设备,然后使用SAS查询字符串正常上传

我建议您先尝试将图片下载到本地的内存流中,然后从流中上传blob。

上传后,您可以发布此流。

更多细节,您可以参考下面的代码示例:

 string blobContainerSasUri = "";

            string filename = "";

            string filepathurl = "";

            CloudBlobContainer container = new CloudBlobContainer(new Uri(blobContainerSasUri));         
            CloudBlockBlob blockblob = container.GetBlockBlobReference(filename);

            using (var client = new HttpClient())
            {
                //get the url 
                var request = new HttpRequestMessage(HttpMethod.Get, "filepathurl");
                var sendTask = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
                var response = sendTask.Result;

                HttpStatusCode status = response.StatusCode;
                if (status == HttpStatusCode.OK)
                {
                    var httpStream = response.Content.ReadAsStreamAsync().Result;
                    MemoryStream ms = new MemoryStream();
                    httpStream.CopyTo(ms);
                    ms.Position = 0;
                    blockblob.UploadFromStream(ms);
                }
            }