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);

Для более подробной информации, пожалуйста, обратитесь к документу

Другие вопросы по тегам