#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>