文件上传系统1
根据华为云的sdk可以得知,obs存储服务提供了以下多种文件上传方案:
·流式上传
·文件上传
·分段上传
·追加上传
·断点续传上传
·基于表单上传
基于本项目已经实现的桶管理操作,定义如下方法:
流式上传
三个不同的方法分别实现了字符、网络流、文件的流式上传
public void putString(String s,String bucketName,String objname){
String content = s;
obsClient.putObject(bucketName, objname, new ByteArrayInputStream(content.getBytes()));
}
public void putStream(String s,String bucketName,String objname) throws IOException {
InputStream inputStream = new URL(s).openStream();
obsClient.putObject(bucketName, objname, inputStream);
}
public void putFile(String s,String bucketName,String objname) throws FileNotFoundException {
FileInputStream fis = new FileInputStream(new File(s)); // 待上传的本地文件路径,需要指定到具体的文件名
obsClient.putObject(bucketName, objname, fis);
}
文件上传
另外,可以将文件以对象方式上传到存储桶中,并定义status方法,获取实时的文件上传进度
/* 文件上传 */
public static void uploadFile(String pathname,String BucketName,String objectKey) throws ObsException
{
File newfile = new File(pathname);
obsClient.putObject(BucketName, objectKey, newfile);
}
/* 获取上传进度 */
public void status(String pathname,String bucketName,String objectKey){
PutObjectRequest request = new PutObjectRequest(bucketName, objectKey);
request.setFile(new File(pathname));
request.setProgressListener(new ProgressListener() {
@Override
public void progressChanged(ProgressStatus status) {
// 获取上传平均速率
System.out.println("AverageSpeed:" + status.getAverageSpeed());
// 获取上传进度百分比
System.out.println("TransferPercentage:" + status.getTransferPercentage());
}
});
// 每上传1MB数据反馈上传进度
request.setProgressInterval(1024 * 1024L);
obsClient.putObject(request);
}
创建文件夹
桶目录下可以通过文件夹系统实现多级目录:
/*创建文件夹*/
public void createFolder(String pathname,String bucketName){
final String keySuffixWithSlash = pathname;
obsClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
}
追加上传
追加上传的方式可实现对同一个对象追加数据内容的功能
/* 追加上传 */
public void AppendObject(String bucketName,String objectKey,String add1){
// 第一次追加上传
AppendObjectRequest request = new AppendObjectRequest();
request.setBucketName(bucketName);
request.setObjectKey(objectKey);
request.setPosition(0);
request.setInput(new ByteArrayInputStream(add1.getBytes()));
AppendObjectResult result = obsClient.appendObject(request);
// 第二次追加上传
// request.setPosition(result.getNextPosition());
// request.setInput(new ByteArrayInputStream("Hello OBS Again".getBytes()));
// result = obsClient.appendObject(request);
System.out.println("NextPosition:" + result.getNextPosition());
System.out.println("Etag:" + result.getEtag());
// 通过获取对象属性接口获取下次追加上传的位置
ObjectMetadata metadata = obsClient.getObjectMetadata(bucketName, objectKey);
System.out.println("NextPosition from metadata:" + metadata.getNextPosition());
}
/*断点续传*/
public void CheckpointUpload(String pathname,String bucketName,String objectKey){
UploadFileRequest request = new UploadFileRequest(bucketName, objectKey);
// 设置待上传的本地文件,localfile为待上传的本地文件路径,需要指定到具体的文件名
request.setUploadFile(pathname);
// 设置分段上传时的最大并发数
request.setTaskNum(5);
// 设置分段大小为10MB
request.setPartSize(10 * 1024 * 1024);
// 开启断点续传模式
request.setEnableCheckpoint(true);
try{
// 进行断点续传上传
CompleteMultipartUploadResult result = obsClient.uploadFile(request);
}catch (ObsException e) {
// 发生异常时可再次调用断点续传上传接口进行重新上传
}
}
基于表单上传
基于表单上传是使用HTML表单形式上传对象到指定桶中,对象最大不能超过5GB
通过ObsClient.createPostSignature生成基于表单上传的请求参数
1使用ObsClient.createPostSignature生成用于鉴权的请求参数。
2准备表单HTML页面。
3将生成的请求参数填入HTML页面。
4选择本地文件,进行表单上传。
/*基于表单上传*/
public void PostSignature(){
PostSignatureRequest request = new PostSignatureRequest();
// 设置表单参数
Map<String, Object> formParams = new HashMap<String, Object>();
// 设置对象访问权限为公共读
formParams.put("x-obs-acl", "public-read");
// 设置对象MIME类型
formParams.put("content-type", "text/plain");
request.setFormParams(formParams);
// 设置表单上传请求有效期,单位:秒
request.setExpires(3600);
PostSignatureResponse response = obsClient.createPostSignature(request);
// 获取表单上传请求参数
System.out.println("\t" + response.getPolicy());
System.out.println("\t" + response.getSignature());
}