开发者社区 问答 正文

玩转阿里云OSS(二)


四、    文件及文件夹的上传
阿里云OSS提供了功能完善而且操作简单的SDK,利用com.aliyun.oss.OSSClient类初始化OSS客户端后,既可进行文件上传、删除等操作。



OSSClient构造函数中的三个参数分别为:
Endpoint为需要操作的bucket的端点,如果bucket在杭州可以为:http://oss.aliyuncs.com
accesskeyID及accessKeySecret为你阿里云账号生成的访问ID及对应秘钥,在阿里云的控制台的右上角可找到access管理的链接:


然后就可以通过putObject进行文件上传操作,示例代码如下:



其中,需要注意的是,必须要设置文件的大小,否则上传到OSS后的文件大小为0,文件并没有上传成功。在pubObject方法中的相关参数为:
buketName:上传后的文件所在的bucket;
key:上传文件对应object的key;
content:上传文件的输入流;
meta:上传文件的元数据;
在控制台中,文件http头中的属性值均可以通过meta进行设置:


文件夹的上传也是通过putObject方法实现,唯一的区别就是文件Key的不同,示例代码如下:









































展开
收起
feun中kul 2015-03-03 17:04:51 8638 分享
分享
版权
举报
阿里云 AI 助理回答

在阿里云OSS中,实际上并没有直接的“文件夹”概念,所有的对象(可以理解为文件)都是以键值对(Key-Value)的形式存储在Bucket中。所谓的“文件夹”,其实是通过Key的路径形式模拟出来的。当你上传一个对象,并且其Key包含路径分隔符(如"/"),这会在OSS控制台上展示为“文件夹结构”。

基于您的描述,这里补充说明如何通过代码实现文件和“文件夹”的上传操作。

文件上传示例

确保您已经正确设置了Endpoint、accessKeyId、accessKeySecret,并且初始化了OSSClient。以下是一个简单的文件上传示例,注意设置文件大小是通过输入流自动完成的,不需要手动指定:

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;

import java.io.FileInputStream;
import java.io.InputStream;

public class UploadFile {
    public static void main(String[] args) {
        String endpoint = "<Your Endpoint>";
        String accessKeyId = "<Your AccessKeyId>";
        String accessKeySecret = "<Your AccessKeySecret>";
        String bucketName = "<Your Bucket Name>";
        String objectKey = "<Your Object Key>"; // 例如 "folder1/myfile.txt"
        
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建上传Object的Metadata。
            ObjectMetadata metadata = new ObjectMetadata();
            // 如果需要设置HTTP头部信息,可以通过metadata进行设置。
            // 例如:metadata.setContentType("image/jpeg");

            // 从本地文件读取数据。
            InputStream inputStream = new FileInputStream("<Your Local File Path>");
            
            // 上传文件。
            ossClient.putObject(bucketName, objectKey, inputStream, metadata);
            System.out.println("Upload file to OSS successfully.");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }
    }
}

“文件夹”上传示例

上传“文件夹”实际上是上传该文件夹下的所有文件,并且每个文件的Key需包含相应的路径前缀来模拟文件夹结构。以下是一个示例逻辑,展示如何遍历本地目录并上传其中的所有文件:

// 假设有一个方法用于递归上传目录下的所有文件
public static void uploadDirectory(OSS ossClient, String bucketName, String localDirPath, String ossDirPrefix) {
    File dir = new File(localDirPath);
    if (!dir.exists() || !dir.isDirectory()) {
        throw new IllegalArgumentException("Invalid directory path: " + localDirPath);
    }

    File[] files = dir.listFiles();
    if (files != null) {
        for (File file : files) {
            if (file.isDirectory()) {
                // 如果是目录,则递归调用
                uploadDirectory(ossClient, bucketName, file.getAbsolutePath(), ossDirPrefix + file.getName() + "/");
            } else {
                // 如果是文件,则上传
                String objectKey = ossDirPrefix + file.getName();
                try (InputStream inputStream = new FileInputStream(file)) {
                    ossClient.putObject(bucketName, objectKey, inputStream, new ObjectMetadata());
                    System.out.println("Uploaded: " + file.getAbsolutePath() + " to OSS as " + objectKey);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

// 调用示例
uploadDirectory(ossClient, bucketName, "<Your Local Directory Path>", "<Your OSS Prefix>");

请将<Your ...>替换为实际的值。这段代码展示了如何递归地遍历本地目录中的所有文件,并将其上传到OSS,同时保持原有的目录结构。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址:
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等