使用SAS(共享访问签名)将文件上载到Azure存储

我知道有库可用于使用Azure存储上传文件。 我已经提到过这个

但是,他们没有提供如何使用SAS的信息。 我有帐户名称,并在那里访问和上传文件的sas url。 但我不知道如何使用它来上传文件。

如果我使用上面提到的库,它显示我invalide存储连接字符串,因为我没有通过它的密钥(这是不需要与sas)。 所以我有点困惑,我如何上传文件。

我也参考这个文档也用于使用sas上传文件。 但没有得到适当的步骤来做到这一点。 他们为他们的Windows应用程序制作了演示。 我想在android中使用sas。

任何人都可以帮助我吗?

UPDATE

我尝试使用下面的代码参考Azure制作控制台应用程序来检查和访问SAS。

 try {
        //Try performing container operations with the SAS provided.

        //Return a reference to the container using the SAS URI.
        //CloudBlockBlob blob = new CloudBlockBlob(new StorageUri(new URI(sas)));
        String[] str = userId.split(":");
        String blobUri = "https://myStorageAccountName.blob.core.windows.net/image/" + str[1] + "/story/" + storyId + "/image1.jpg" + sas.toString().replaceAll(""","");
        Log.d(TAG,"Result:: blobUrl 1 : "+blobUri);
        CloudBlobContainer container = new CloudBlobContainer(new URI(blobUri));
        Log.d(TAG,"Result:: blobUrl 2 : "+blobUri);
        CloudBlockBlob blob = container.getBlockBlobReference("image1.jpg");
        String filePath = postData.get(0).getUrl().toString();
        /*File source = new File(getRealPathFromURI(getApplicationContext(),Uri.parse(filePath))); // File path
        blob.upload(new FileInputStream(source), source.length());*/
        Log.d(TAG,"Result:: blobUrl 3 : "+blobUri);
        //blob.upload(new FileInputStream(source), source.length());
        //blob.uploadText("Hello this is testing..."); // Upload text file
        Log.d(TAG, "Result:: blobUrl 4 : " + blobUri);
        Log.d(TAG, "Write operation succeeded for SAS " + sas);
        response = "success";
        //Console.WriteLine();
    } catch (StorageException e) {
        Log.d(TAG, "Write operation failed for SAS " + sas);
        Log.d(TAG, "Additional error information: " + e.getMessage());
        response = e.getMessage();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        response = e.getMessage();
    } catch (IOException e) {
        e.printStackTrace();
        response = e.getMessage();
    } catch (URISyntaxException e) {
        e.printStackTrace();
        response = e.getMessage();
    } catch (Exception e){
        e.printStackTrace();
        response = e.getMessage();
    }

现在,当我上传文本只有它说我下面的错误

服务器无法验证请求。 确保授权标头的值正确形成,包括签名。

现在,我的要求是上传图像文件。 所以,当我取消上传图片文件的代码时,它不会给我任何错误,但即使没有上传图片文件。 我不知道这里有什么错。 有人能帮我一下吗。

谢谢。


@kumar kundal你解释的机制是完全正确的。 以下是有关将配置文件映像上载到Azure服务器的更详细答案。

首先创建SAS网址将Image(或任何文件)上传到Blob存储:

String sasUrl = "";
// mClient is the MobileServiceClient
ListenableFuture<JsonElement> result = mClient.invokeApi(SOME_URL_CREATED_TO_MAKE_SAS, null, "GET", null);
Futures.addCallback(result, new FutureCallback<JsonElement>() {
        @Override
        public void onSuccess(JsonElement result) {
            // here you will get SAS url from server
            sasUrl = result; // You need to parse it as per your response
        }

        @Override
        public void onFailure(Throwable t) {
        }
    });

现在,你和你一起吃饭。 这将如下所示字符串:

sv=2015-04-05&ss=bf&srt=s&st=2015-04-29T22%3A18%3A26Z&se=2015-04-30T02%3A23%3A26Z&sr=b&sp=rw&sip=168.1.5.60-168.1.5.70&spr=https&sig=F%6GRVAZ5Cdj2Pw4tgU7IlSTkWgn7bUkkAg8P6HESXwmf%4B

现在,您需要使用您的上传网址来取消网址。 请参阅下面的代码,其中我使用我的上传请求取消了SAS网址。

try {
        File source = new File(filePath); // File path
        String extantion = source.getAbsolutePath().substring(source.getAbsolutePath().lastIndexOf("."));
        // create unique number to identify the image/file.
        // you can also specify some name to image/file
        String uniqueID = "image_"+ UUID.randomUUID().toString().replace("-", "")+extantion; 
        String blobUri = MY_URL_TO_UPLOAD_PROFILE_IMAGE + sas.replaceAll(""","");
        StorageUri storage = new StorageUri(URI.create(blobUri));
        CloudBlobClient blobCLient = new CloudBlobClient(storage);
        CloudBlobContainer container = blobCLient.getContainerReference("");
        CloudBlockBlob blob = container.getBlockBlobReference(uniqueID);
        BlobOutputStream blobOutputStream = blob.openOutputStream();
        byte[] buffer = fileToByteConverter(source);
        ByteArrayInputStream inputStream = new ByteArrayInputStream(buffer);
        int next = inputStream.read();
        while (next != -1) {
            blobOutputStream.write(next);
            next = inputStream.read();
        }
        blobOutputStream.close();
        // YOUR IMAGE/FILE GET UPLOADED HERE
        // IF YOU HAVE FOLLOW DOCUMENT, YOU WILL RECEIVE IMAGE/FILE URL HERE 
    } catch (StorageException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e){
        e.printStackTrace();
    }

我希望这些信息可以帮助您使用blob存储上传文件。 除此之外,如果您有任何疑问,请告诉我。 我可以帮忙。


您可以参考本文https://azure.microsoft.com/en-us/documentation/articles/storage-configure-connection-string/,了解如何通过通过存储帐户访问资源时正确配置连接字符串共享访问签名(SAS)。


将图片上传到BLOB存储 。 我找了几个小时后找到了。看看: -

上传照片图像是一个多步骤的过程:

首先拍摄一张照片,然后将TodoItem行插入到包含Azure存储使用的TodoItem数据字段的SQL数据库中。 新的移动服务SQL插入脚本要求Azure存储Shared Access Signature (SAS) 。 该脚本将SAS和该blob的URI返回给客户端。 客户端使用SAS和blob URI上传照片。

那么什么是SAS

将数据上传到客户端应用程序内的Azure存储服务所需的凭据并不安全。 而是将这些凭据存储在移动服务中,并使用它们生成Shared Access Signature (SAS) ,以授予上载新映像的权限。 SAS是一份5分钟到期的凭证,由移动服务安全地返回到客户端应用程序。 该应用程序然后使用此临时凭证上传图像。

进一步查询和详细分析。 访问这个官方文档https://azure.microsoft.com/en-us/documentation/articles/mobile-services-android-upload-data-blob-storage/

链接地址: http://www.djcxy.com/p/28011.html

上一篇: Upload file with Azure Storage using SAS (Shared Access Signature)

下一篇: Visual Studio Service Reference WSDL return type doesn't match