Как отправить входной поток файла в качестве ответа с помощью azure-storage-file-datalake sdk?

#java #azure #jax-rs #azure-data-lake #azure-data-lake-gen2

#java #azure #jax-rs #azure-data-lake #azure-data-lake-gen2

Вопрос:

Я хочу загрузить большой csv-файл в веб-приложение. Веб-приложение отправляет запрос API службе, которая затем обращается к API хранилища озера данных Azure, используя ADLSClient в azure-storage-file-datalake. Пример кода в службе выглядит следующим образом:

 val client = getADLSClientGen2(dataSourceInstanceName, fileSystem)
val fileClient = client.getFileClient(filePath)
val outputStream: OutputStream = ByteArrayOutputStream()
fileClient.read(outputStream)
outputStream.close()
val buffer = outputStream as ByteArrayOutputStream
return ByteArrayInputStream(buffer.toByteArray())
  

В приведенном выше коде весь файл считывается в outputstream, затем его входной поток отправляется в качестве ответа в запросе api. Я хочу иметь возможность отправлять входной поток файла, считанного из файловой системы adls, напрямую

Ответ №1:

Насколько я понимаю, в вашем веб-приложении вы хотите иметь входной поток для .CSV-файл, который хранится в ADLS Gen2. Поскольку ADLS Gen2 встроен в службу хранения Azure, поэтому на стороне сервера мы можем просто использовать токен SAS для вашего веб-приложения и веб-приложения, чтобы сделать HTTP-запрос для загрузки этого файла непосредственно из ADLS Gen2, чтобы вы могли получить этот входной поток из HTTP-ответа.

Это код для генерации токена sas большого двоичного объекта:

         String connString = "<conntion string>";
        String containerName = "<container name>";
        String blobName = "<.csv name>";

        BlobServiceClient client = new BlobServiceClientBuilder().connectionString(connString).buildClient();
        BlobClient blobClient = client.getBlobContainerClient(containerName).getBlobClient(blobName);

        BlobSasPermission blobSasPermission = new BlobSasPermission().setReadPermission(true); // grant read
                                                                                               // permission
                                                                                               // onmy
        OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1); // 1 day to expire
        BlobServiceSasSignatureValues values = new BlobServiceSasSignatureValues(expiryTime, blobSasPermission)
                        .setStartTime(OffsetDateTime.now());

        System.out.println(blobClient.getBlobUrl()   "?"   blobClient.generateSas(values));
  

зависимость maven:

    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-storage-blob</artifactId>
      <version>12.9.0</version>
    </dependency>
  

Пример кода веб-приложения:

 <html>

    <body>
    
        
    
    
    </body>
    
    <script>
    
        var xhr = new XMLHttpRequest();
            xhr.open('GET', 'CVS file URL with sas');
            xhr.seenBytes = 0;

            xhr.onreadystatechange = function() {
              console.log("state change.. state: "  xhr.readyState);

              if(xhr.readyState == 3) {
                var newData = xhr.response.substr(xhr.seenBytes);
                console.log("newData: <<"  newData  ">>");
                document.body.innerHTML  = "New data: "  newData  "<br />";

                xhr.seenBytes = xhr.responseText.length;
                console.log("seenBytes: "  xhr.seenBytes);
              }
            };

            xhr.addEventListener("error", function(e) {
              console.log("error: "  e);
            });

            console.log(xhr);
            xhr.send();
    </script>

</html>  

Содержимое файла CSV загружается постепенно: введите описание изображения здесь