云存储服务broker系统(五)——文件上传系统1

文件上传系统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());
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值