Загрузить каталог с подкаталогами в хранилище больших двоичных объектов Java и Azure - PullRequest
0 голосов
/ 29 января 2019

Я использую этот код для загрузки файлов в хранилище BLOB-объектов Azure, но при попытке загрузить каталог с подкаталогами я получаю сообщение об ошибке «Обнаружено исключение FileNotFoundException: C: \ upload \ bin»: (доступ запрещен), любое решение длязагрузить файлы и каталоги в исходный каталог?

try {
        CloudStorageAccount account = CloudStorageAccount.parse(storageConnectionString);
        CloudBlobClient serviceClient = account.createCloudBlobClient();

        // Container name must be lower case.
        CloudBlobContainer container = serviceClient.getContainerReference(containerName);
        container.createIfNotExists();
        File source = new File(path);
        if (source.list().length > 0) {
            for (File file : source.listFiles()) {
                CloudBlockBlob blob = container.getBlockBlobReference(file.getName());
                if (blob.exists() == false) {
                    File sourceFile = new File(source + "\\" + file.getName());
                    blob.upload(new FileInputStream(sourceFile), sourceFile.length());
                    System.out.println("File " + source + "\\" + file.getName() + " Load to blob storage");
                } else System.out.println("File " + source + "\\" + file.getName() + " Already exist in storage");
            }
        } else System.out.println("In folder " + path + " are no files ");
    } catch (FileNotFoundException fileNotFoundException) {
        System.out.print("FileNotFoundException encountered: ");
        System.out.println(fileNotFoundException.getMessage());
        System.exit(-1);

    } catch (StorageException storageException) {
        System.out.print("StorageException encountered: ");
        System.out.println(storageException.getMessage());
        System.exit(-1);
    } catch (Exception e) {
        System.out.print("Exception encountered: ");
        System.out.println(e.getMessage());
        System.exit(-1);
    }

1 Ответ

0 голосов
/ 30 января 2019

Как сказал @ ZhaoxingLu-Microsoft, объекта file, сгенерированного source.listFiles(), достаточно для получения абсолютного пути к файлу через file.getAbsolutePath(), поэтому вы можете написать свой код следующим образом.

if (blob.exists() == false) {
    blob.uploadFromFile(file.getAbsolutePath());
} else System.out.println("File " + file.getAbsolutePath() + " Already exist in storage");

Я проверяю ваш код в моей среде, он также работает.Однако, по моему опыту, ваша проблема FileNotFoundException encountered: C:\upload\bin" :(Access is denied) была вызвана отсутствием разрешения на доступ к файлам под C: или C:\upload\bin.Таким образом, вам нужно запустить ваш код как администратор в вашей текущей среде Windows, как показано на рисунках ниже.

Рис 1. Запустите ваш код как администратор, если используете IntelliJ

enter image description here

Рис 2. Запустите ваш код от имени администратора при использовании Eclipse

enter image description here

Рис 3. Запустите свой код от имени администратора с помощью командыПодсказка

enter image description here


Обновление : в хранилище BLOB-объектов Azure структура файлов и каталогов зависит от имени BLOB-объекта.Поэтому, если вы хотите увидеть структуру файла, как показано на рисунке ниже, вы можете использовать код String blobName = file.getAbsolutePath().replace(path, "");, чтобы получить имя BLOB-объекта.

Рис. 4. Структура файлов и каталогов, созданная на моем локальном компьютере enter image description here

Рис. 5. То же самое выше для хранилища BLOB-объектов Azure через обозреватель хранилища Azure enter image description here

Вот мой полный код.

private static final String path = "D:\\upload\\";
private static final String storageConnectionString = "<your storage connection string>";
private static final String containerName = "<your container for uploading>";

private static CloudBlobClient serviceClient;

public static void upload(File file) throws InvalidKeyException, URISyntaxException, StorageException, IOException {
    // Container name must be lower case.
    CloudBlobContainer container = serviceClient.getContainerReference(containerName);
    container.createIfNotExists();
    String blobName = file.getAbsolutePath().replace(path, "");
    CloudBlockBlob blob = container.getBlockBlobReference(blobName);
    if (blob.exists() == false) {
        blob.uploadFromFile(file.getAbsolutePath());
    } else {
        System.out.println("File " + file.getAbsolutePath() + " Already exist in storage");
    }
}

public static void main(String[] args)
        throws URISyntaxException, StorageException, InvalidKeyException, IOException {
    CloudStorageAccount account = CloudStorageAccount.parse(storageConnectionString);
    serviceClient = account.createCloudBlobClient();
    File source = new File(path);
    for (File fileOrDir : source.listFiles()) {
        boolean isFile = fileOrDir.isFile();
        if(isFile) {
            upload(fileOrDir);
        } else {
            for(File file: fileOrDir.listFiles()) {
                upload(file);
            }
        }

    }
}
...