详情页标题前

阿里云对象存储OSSJava追加上传-云淘科技

详情页1

追加上传是指通过AppendObject方法在已上传的追加类型文件(Appendable Object)末尾直接追加内容。

注意事项

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见访问域名和数据中心。
  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见Java配置访问凭证。

  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见新建OSSClient。
  • 要追加上传,您必须有oss:PutObject权限。具体操作,请参见为RAM用户授权自定义的权限策略。

  • 当文件不存在时,调用AppendObject接口会创建一个追加类型文件。

  • 当文件已存在时:

    • 如果文件为追加类型文件,且设置的追加位置和文件当前长度相等,则直接在该文件末尾追加内容。

    • 如果文件为追加类型文件,但是设置的追加位置和文件当前长度不相等,则抛出PositionNotEqualToLength异常。

    • 如果文件为非追加类型文件时,例如通过简单上传的文件类型为Normal的文件,则抛出ObjectNotAppendable异常。

  • 追加类型文件暂不支持CopyObject操作。

示例代码

以下代码用于追加上传文件。

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.AppendObjectRequest;
import com.aliyun.oss.model.AppendObjectResult;
import com.aliyun.oss.model.ObjectMetadata;
import java.io.ByteArrayInputStream;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填写Bucket名称,例如examplebucket。
        String bucketName = "examplebucket";
        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "exampledir/exampleobject.txt";
        String content1 = "Hello OSS A 
";
        String content2 = "Hello OSS B 
";
        String content3 = "Hello OSS C 
";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            ObjectMetadata meta = new ObjectMetadata();
            // 指定上传的内容类型。
            meta.setContentType("text/plain");
            // 指定该Object的网页缓存行为。
            //meta.setCacheControl("no-cache");
            // 指定该Object被下载时的名称。
            //meta.setContentDisposition("attachment;filename=oss_download.txt");
            // 指定该Object的内容编码格式。
            //meta.setContentEncoding(OSSConstants.DEFAULT_CHARSET_NAME);
            // 该请求头用于检查消息内容是否与发送时一致。
            //meta.setContentMD5("ohhnqLBJFiKkPSBO1eNaUA==");
            // 指定过期时间。
            //try {
            //    meta.setExpirationTime(DateUtil.parseRfc822Date("Wed, 08 Jul 2022 16:57:01 GMT"));
            //} catch (ParseException e) {
            //    e.printStackTrace();
            //}
            // 指定服务器端加密方式。此处指定为OSS完全托管密钥进行加密(SSE-OSS)。
            //meta.setServerSideEncryption(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
            // 指定Object的访问权限。此处指定为私有访问权限。
            //meta.setObjectAcl(CannedAccessControlList.Private);
            // 指定Object的存储类型。
            //meta.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);
            // 创建AppendObject时可以添加x-oss-meta-*,继续追加时不可以携带此参数。如果配置以x-oss-meta-*为前缀的参数,则该参数视为元数据。
            //meta.setHeader("x-oss-meta-author", "Alice");

            // 通过AppendObjectRequest设置多个参数。
            AppendObjectRequest appendObjectRequest = new AppendObjectRequest(bucketName, objectName, new ByteArrayInputStream(content1.getBytes()),meta);

            // 通过AppendObjectRequest设置单个参数。
            // 设置Bucket名称。
            //appendObjectRequest.setBucketName(bucketName);
            // 设置Object名称。
            //appendObjectRequest.setKey(objectName);
            // 设置待追加的内容。可选类型包括InputStream类型和File类型。此处为InputStream类型。
            //appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
            // 设置待追加的内容。可选类型包括InputStream类型和File类型。此处为File类型。
            //appendObjectRequest.setFile(new File("D:\localpath\examplefile.txt"));
            // 指定文件的元信息,第一次追加时有效。
            //appendObjectRequest.setMetadata(meta);

            // 第一次追加。
            // 设置文件的追加位置。
            appendObjectRequest.setPosition(0L);
            AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
            // 文件的64位CRC值。此值根据ECMA-182标准计算得出。
            System.out.println(appendObjectResult.getObjectCRC());

            // 第二次追加。
            // nextPosition表示下一次请求中应当提供的Position,即文件当前的长度。
            appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
            appendObjectRequest.setInputStream(new ByteArrayInputStream(content2.getBytes()));
            appendObjectResult = ossClient.appendObject(appendObjectRequest);

            // 第三次追加。
            appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
            appendObjectRequest.setInputStream(new ByteArrayInputStream(content3.getBytes()));
            appendObjectResult = ossClient.appendObject(appendObjectRequest);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

相关文档

  • 关于追加上传的完整示例代码,请参见GitHub示例。

  • 关于追加上传的API接口说明,请参见AppendObject。

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/158027.html

(0)
上一篇 2023年12月10日
下一篇 2023年12月10日
详情页2

相关推荐

  • 阿里云RDS数据库迁移RDS SQL Server数据到本地SQL Server-云淘科技

    RDS SQL Server支持通过物理备份文件将云上的数据迁移到本地数据库。 说明 除了本文介绍的迁移方法外,您还可以使用数据传输服务DTS(Data Transmission Service),将RDS SQL Server数据迁移至自建SQL Server。 操作步骤 下载RDS SQL Server的全量和增量物理备份文件,并上传至自建SQL Ser…

    2023年12月9日
  • 阿里云对象存储OSS存储空间概览-云淘科技

    您可以在每个存储空间(Bucket)的概览页查看您对应Bucket的使用情况,包括存储量、访问流量、访问域名、自定义常用功能列表等。 基本信息 在基本信息区域,您可以查看存储空间名称、存储空间所在地域、存储类型、创建时间等信息。 当前使用情况在基础数据区域,您可以查看当前存储空间总存储量、本月流量、本月请求次数、文件数量、文件碎片。 重要 基础数据的统计结果…

    阿里云对象存储 2023年12月10日
  • 阿里云对象存储OSS设置跨域规则后调用OSS时仍然报“No ‘Access-Control-Allow-Origin’”的错误-云淘科技

    问题描述 为了实现跨域访问,保证跨域数据传输的安全进行,在OSS控制台设置了跨域CORS规则后,通过SDK进行程序调用时报以下错误。 No ‘Access-Control-Allow-Origin’ header is present on the requested resource 问题原因 出现跨域问题的原因如下: 跨域CORS规则设置异常: 未正确设…

    2023年12月10日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云日志服务SLSCSV格式-云淘科技

    日志服务将日志投递到OSS后,支持存储为不同的文件格式。本文介绍CSV格式。 参数配置 在创建OSS投递任务(新版)时,选择存储格式为csv,对应的参数配置如下所示。 参数说明如下所示。更多信息,请参见CSV标准和postgresql CSV说明。 参数 说明 CSV字段 在原始日志页签中查看日志字段,将需要投递到OSS的字段名有序填入。 日志服务还提供保留…

    阿里云日志服务SLS 2023年12月10日
  • 阿里云云原生大数据计算服务 MaxComputeSpark访问湖仓一体外部数据源-云淘科技

    MaxCompute Spark目前已支持访问湖仓一体外部数据源,解决从Spark更换为MaxCompute处理数据时,需要迁移Spark作业到MaxCompute的问题,降低使用成本。本文为您介绍使用MaxCompute访问外部数据源的示例。 访问基于Hadoop外部数据源的外部项目 MaxCompute SQL访问外部项目表 — hadoop_exte…

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。