为了账号安全,请及时绑定邮箱和手机立即绑定

在 java 和 azure blob storage sdk 中上传带有子目录的目录

在 java 和 azure blob storage sdk 中上传带有子目录的目录

茅侃侃 2022-05-25 15:54:21
我使用此代码将文件上传到 azure blob 存储,但是当我尝试使用子目录加载目录时出现错误“遇到 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 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

正如@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,请以管理员身份运行您的代码

//img1.sycdn.imooc.com//628de0cb0001e5e703020257.jpg

图 2. 如果使用 Eclipse,请以管理员身份运行您的代码

//img1.sycdn.imooc.com//628de0d70001933b03030213.jpg

图 3. 通过命令提示符以管理员身份运行您的代码

//img1.sycdn.imooc.com//628de0e200013b2902810223.jpg

更新:在 Azure Blob 存储上,文件和目录结构取决于 blob 名称。因此,如果您想查看如下图的文件结构,可以使用代码String blobName = file.getAbsolutePath().replace(path, "");获取 blob 名称。

图 4. 在我的本地机器上构建的文件和目录结构 

//img1.sycdn.imooc.com//628de1020001d38f02900200.jpg

图 5. 通过 Azure 存储资源管理器在 Azure Blob 存储上进行上述操作 

//img1.sycdn.imooc.com//628de11300017b5706470105.jpg

这是我的完整代码。


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

            }

        }


    }

}


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信