当前位置: 首页 > 知识库问答 >
问题:

从Android示例上载Azure存储块Blob

谷梁驰
2023-03-14

我使用android应用程序中的以下代码将blob上传到Azure blob存储。注意:下面的sasUrl参数是从我的web服务获取的签名url:

    // upload file to azure blob storage
    private static Boolean upload(String sasUrl, String filePath, String mimeType) {
        try {
            // Get the file data
            File file = new File(filePath);
            if (!file.exists()) {           
                    return false;
            }

            String absoluteFilePath = file.getAbsolutePath();

            FileInputStream fis = new FileInputStream(absoluteFilePath);
            int bytesRead = 0;
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            while ((bytesRead = fis.read(b)) != -1) {
                bos.write(b, 0, bytesRead);
            }
            fis.close();
            byte[] bytes = bos.toByteArray();
            // Post our image data (byte array) to the server
            URL url = new URL(sasUrl.replace("\"", ""));
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setDoOutput(true);
            urlConnection.setConnectTimeout(15000);
            urlConnection.setReadTimeout(15000);
            urlConnection.setRequestMethod("PUT");
            urlConnection.addRequestProperty("Content-Type", mimeType);
            urlConnection.setRequestProperty("Content-Length", "" + bytes.length);
            urlConnection.setRequestProperty("x-ms-blob-type", "BlockBlob");
            // Write file data to server
            DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream());
            wr.write(bytes);
            wr.flush();
            wr.close();
            int response = urlConnection.getResponseCode();
            if (response == 201 && urlConnection.getResponseMessage().equals("Created")) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

该代码对于小的blob来说运行良好,但是当blob达到一定的大小(取决于我测试的手机)时,我开始出现内存不足的异常。我想拆分这些blob并将它们分块上传。然而,我在网上找到的所有示例都是基于C#的,并且都在使用存储客户端库。我正在寻找一个Java/Android示例,它使用Azure Storage Rest API分块上传blob。

共有1个答案

柯奕
2023-03-14

这里发布了一个Azure存储Android库。示例文件夹中有一个基本blob存储示例。您可能希望使用的方法是blob类中的uploadFromFile。默认情况下,如果blob的大小小于64MB,则会尝试将其放入一个put中,否则将以4MB的块发送blob。如果希望减少64MB的限制,可以在CloudBlobClient(将影响所有请求)的BlobRequestOptions对象上设置singleBlobPutThresholdInBytes属性,或者将其传递给uploadFromFile方法(仅影响该请求)。存储库包括许多方便的功能,如自动重试和块put请求的最大执行超时,这些都是可配置的。

如果您仍然想使用更手动的方法,这里提供了PutBlock和Put Block List API参考,并提供了通用的跨语言文档。这些在Azure存储Android库的CloudBlockBlob类中有很好的包装,称为uploadBlock和commitBlockList,这可能会为手动请求构造节省大量时间,并提供上述一些便利。

 类似资料:
  • 我能够通过Node/Express将文件上传到Azure blob存储,没有任何问题,但我找到了关于如何下载文件的非常少的文档/完整示例。我在教程页面上找到了这个,但是运气不好: 是否有其他人使用node.js/express从Azure blob存储下载文件?您是否使用Azure或其他方法(例如请求)。您能否分享如何从Azure获取文件并将其流式传输到文件夹?

  • 我正在尝试将一个blob存储从我的存储帐户映射到我的databricks集群。我正在跟踪这个链接,显然我只需要在我的笔记本上执行这段代码: 代码蟒蛇: 我被困在参数中:< code>(scope = " 在Database ricks CLI上尝试过:

  • 我正在尝试将一个图像文件从html页面上传到azure blob存储。到目前为止,我已经编写了一个web服务来为我的blob容器创建SAS。由此,我创建了一个uri,格式为“blob地址”/“容器名称”/“blob名称”?“sas”。我的html页面上有一个上传控件。 然后,我尝试使用以下代码上传该文件: 其中blobPath是上面提到的uri,upFile是我的html上传控件。 当我试图上传文

  • 每当学习新技术时,我都喜欢写一个尽可能简单的例子。通常这意味着引用最少的控制台应用程序。我一直在尝试编写一个读取和写入Azure表存储的应用程序,但收效甚微。我使用了这个操作指南作为基础,但尝试在Main方法中完成所有操作。类似的方法在blob存储中效果很好,但表存储遇到了麻烦。 我能够使用此代码创建一个表。 运行此代码后,我可以使用Azure存储资源管理器在我的存储中看到一个表。(仍然不知道如何

  • 我创建了一个使用Firebase存储运行的应用。这个想法是,您从照片库中选择一张图片,然后将其上传到Firebase存储。与Firebase的连接似乎工作正常,我可以选择图像。当我按下提交按钮将其上传到Firebase时,问题就出现了。 当我点击它一次,什么也没发生。 当我点击它几次时,我得到一条消息“发生未知错误,请检查HTTP结果代码和内部异常”。。 我该怎么做,寻求建议。。 从舱单中: 从活

  • 我正在数据砖笔记本上运行这个 我得到了这个错误 原因:存储异常:服务器无法对请求进行身份验证。确保授权头的值格式正确,包括签名。 我尝试使用 以获取 Azure Blob 存储中的任何更新,但仍收到上述错误。