四、 文件及文件夹的上传
阿里云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的不同,示例代码如下:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在阿里云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助理
可以解答问题、推荐解决方案等