ZIP-файл службы хранилища Azure поврежден после загрузки (с использованием клиентской библиотеки BLOB-объектов службы хранилища Azure для Java)
Проблема: zip-файл с CSV-файлами, созданными на основе данных, кажется поврежденным после загрузки в хранилище BLOB-объектов Azure.
zip-файл перед загрузкой выглядит так:
и все нормально работает. Тот же самый zip-файл после загрузки поврежден и выглядит так:
Во время загрузки я использую клиентскую библиотеку BLOB-объектов хранилища Azure для Java (v. 12.7.0, но я пробовал и предыдущие версии). Это код, который я использую (аналогичный примеру, приведенному в файле readme SDK):
public void uploadFileFromPath(String pathToFile, String blobName) {
BlobClient blobClient = blobContainerClient.getBlobClient(blobName);
blobClient.uploadFromFile(pathToFile);
}
И я получаю загруженный файл:
Когда я загружаю файл прямо из обозревателя хранилища, файл уже поврежден. Что я делаю не так?
2 ответа
В конце концов это была моя вина. Я не закрыл ZipOutputStream перед загрузкой файла. Это не проблема, когда вы используете try с ресурсами и просто хотите сгенерировать локальный файл. Но в моем случае я хочу загрузить файл в хранилище BLOB-объектов (все еще в разделе пробных версий). Файл был неполным (не закрыт), поэтому он оказался на хранилище с поврежденными данными. Это то, что я должен делать с самого начала.
private void addZipEntryAndDeleteTempCsvFile(String pathToFile, ZipOutputStream zipOut,
File file) throws IOException {
LOGGER.info("Adding zip entry: {}", pathToFile);
zipOut.putNextEntry(new ZipEntry(pathToFile));
try (FileInputStream fis = new FileInputStream(file)) {
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
zipOut.closeEntry();
file.delete()
}
zipOut.close(); // missing part
}
В конце концов, спасибо за помощь @JimXu. Я это очень ценю.
В соответствии с вашим описанием я предлагаю вам использовать следующий метод для загрузки zip-файла
public void uploadFromFile(String filePath, ParallelTransferOptions parallelTransferOptions, BlobHttpHeaders headers, Map<String,String> metadata, AccessTier tier, BlobRequestConditions requestConditions, Duration timeout)
Мы можем использовать метод для установки типа контента
Например
BlobHttpHeaders headers = new BlobHttpHeaders()
.setContentType("application/x-zip-compressed");
Integer blockSize = 4* 1024 * 1024; // 4MB;
ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions(blockSize, null, null);
blobClient.uploadFromFile(pathToFile,parallelTransferOptions,headers,null, AccessTier.HOT, null, null);
Для более подробной информации, пожалуйста, обратитесь к документу