Azure / azure-storage-cpp

Microsoft Azure Storage Client Library for C++
http://azure.github.io/azure-storage-cpp
Apache License 2.0
131 stars 147 forks source link

download_to_stream() gives code "NotFoundError" even though blob exists #408

Open drd2021 opened 2 years ago

drd2021 commented 2 years ago

Using azure-storage-cpp (probably v7.4) on Linux, I am trying to download a binary file into a std::vector. The file exists under the container "testcontainer". Why does the function download_to_stream() fails with error code "NotFoundError"?

Here's my code and the output below:

Code:

        const utility::string_t storage_connection_string(U("DefaultEndpointsProtocol=https;AccountName=<my_account>;AccountKey=<my_key>"));
        azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);
        azure::storage::cloud_blob_client blob_client = storage_account.create_cloud_blob_client();
        azure::storage::cloud_blob_container container = blob_client.get_container_reference(_XPLATSTR("testcontainer"));
        sout << "Container name? " << container.name() << "\n";
        sout << "Container successfully created? " << container.create_if_not_exists() << "\n";
        azure::storage::continuation_token token;
        do {
                azure::storage::list_blob_item_segment result = container.list_blobs_segmented(token);
                for (auto& item : result.results()){
                        if (item.is_blob()){
                                sout << "Blob: " << item.as_blob().uri().primary_uri().to_string() << "\n";
                                sout << "Blob name: " << item.as_blob().name() << "\n";
                                sout << "Blob uri path: " << item.as_blob().uri().path() << "\n";
                                sout << "Blob content type: " << item.as_blob().properties().content_type() << "\n";
                                auto binary_blob = container.get_block_blob_reference(item.as_blob().name());
                                concurrency::streams::container_buffer<std::vector<uint8_t>> buffer;
                                concurrency::streams::ostream output(buffer);
                                binary_blob.download_to_stream(output);
                                sout << "Stream: " << utility::string_t(buffer.collection().begin(), buffer.collection().end()) << "\n";
                        }
                        else {
                                sout << "Directory: " << item.as_blob().uri().primary_uri().to_string() << "\n";
                        }
                }
                token = result.continuation_token();
        } while (!token.empty());

Output:

Container name? testcontainer
Container successfully created? 0
Blob: https://<my_account>.blob.core.windows.net/testcontainer/0b8ba7c0ef5e37733617c1a95b866aa378b102fdc34e23cc523ca8a5d3acf7f4
Blob name: 0b8ba7c0ef5e37733617c1a95b866aa378b102fdc34e23cc523ca8a5d3acf7f4
Blob uri path: /testcontainer/0b8ba7c0ef5e37733617c1a95b866aa378b102fdc34e23cc523ca8a5d3acf7f4
Blob content type: application/octet-stream
Stream: {
    "error": {
        "message": "File \"0b8ba7c0ef5e37733617c1a95b866aa378b102fdc34e23cc523ca8a5d3acf7f4\" not found",
        "code": "NotFoundError"
    }
}
Jinming-Hu commented 2 years ago

I tried with 7.4.0 release (100c4d87ac6a6530caec22999a82ba99fbdf10bd). It works for me

Container name? testcontainer
Container successfully created? 0
Blob: https://ACCOUNT.blob.core.windows.net/testcontainer/0b8ba7c0ef5e37733617c1a95b866aa378b102fdc34e23cc523ca8a5d3acf7f4
Blob name: 0b8ba7c0ef5e37733617c1a95b866aa378b102fdc34e23cc523ca8a5d3acf7f4
Blob uri path: /testcontainer/0b8ba7c0ef5e37733617c1a95b866aa378b102fdc34e23cc523ca8a5d3acf7f4
Blob content type: application/octet-stream
Stream: Hello Azure!

Can you go to Azure Portal and check if the blob actually exists and is not deleted?