华为云obs照片上传 上传原图的同时再上传缩略图

后端接口接收数据和业务代码

@PostMapping("/uploadphoto")
  @OperationLog(name = "照片上传", type = OperationLogType.UPLOAD)
  @ApiOperation(value = "照片上传", response = ApiResult.class)
  @ApiImplicitParams({
    @ApiImplicitParam(name = "file", value = "文件", required = true),
    @ApiImplicitParam(name = "photoSizeId", value = "照片尺寸ID", required = true),
    @ApiImplicitParam(name = "subfixFile", value = "照片后缀 如 .png", required = true)
  })
  public ApiResult uploadPhoto(
      @RequestParam("photoSizeId") String photoSizeId,
      @RequestParam("advanced") String advanced,
      @RequestParam("subfixFile") String subfixFile,
      @RequestParam(value = "file") MultipartFile file)
      throws Exception {
    Long userId = DeviceQueryUtil.getUserId();

    if (userId.equals(-1L)
        || !StringUtils.isNumeric(photoSizeId)
        || !StringUtils.isNumeric(advanced)
        || StringUtils.isBlank(subfixFile)
        || file.isEmpty()) {
      return ApiResult.result(ApiCode.FAIL, "信息错误", null);
    }
    // 获取传过来的文件名
    String fileName = file.getOriginalFilename();

    UploadPhotoParam uploadPhotoParam =
        photoStorageService.uploadPhoto(file, fileName, subfixFile, photoSizeId, userId, advanced);
    if (!StringUtils.isBlank(uploadPhotoParam.getThumbnailsUrl())
        && uploadPhotoParam.getPhotoStorageId() > 0L) {
      return ApiResult.result(ApiCode.SUCCESS, "照片上传成功", uploadPhotoParam);
    }

    return ApiResult.result(ApiCode.FAIL, "照片上传失败", null);
  }
  @Override
  public UploadPhotoParam uploadPhoto(
      MultipartFile file,
      String fileName,
      String subfixFile,
      String photoSizeId,
      Long userId,
      String advanced)
      throws IOException {

    // 通过UUID和后缀名拼接新的文件名
    String newFileName = userId + "/" + IdUtil.simpleUUID() + subfixFile;
    String ThumbnailsName = userId + "/" + IdUtil.simpleUUID() + subfixFile;

    UploadPhotoParam uploadPhotoParam = new UploadPhotoParam();
    // 上传文件流。
    try {

      // 创建ObsClient实例
      ObsClient obsClient = new ObsClient(ak, sk, endPoint);
      // 上传网络流。
      InputStream inputStream = file.getInputStream();
      PutObjectResult putObjectResult = obsClient.putObject(bucketName, newFileName, inputStream);
      String Url = putObjectResult.getObjectUrl();
      // 缩略照片上传
      ByteArrayOutputStream os = new ByteArrayOutputStream();
      Thumbnails.of(file.getInputStream()).forceSize(49, 60).toOutputStream(os);
      ByteArrayInputStream ThumbnailsInputStream = ImageUtil.parseToInputStream(os);
      putObjectResult = obsClient.putObject(bucketName, ThumbnailsName, ThumbnailsInputStream);
      String ThumbnailsUrl = putObjectResult.getObjectUrl();

      // 关闭流
      inputStream.close();
      os.close();
      // 关闭obsClient
      obsClient.close();
      // 保存照片信息
      PhotoStorage photoStorage = new PhotoStorage();
      // 上传原文件名称
      photoStorage.setPhotoName(fileName);
      photoStorage.setPhotoSizeId(Integer.parseInt(photoSizeId));
      // 只存照片的名称  域名是可配置的
      photoStorage.setUrl(newFileName);
      photoStorage.setThumbnailsUrl(ThumbnailsName);
      photoStorage.setStatus(PhotoStorageType.NoPay.code);
      photoStorage.setUserId(userId);
      photoStorage.setAdvanced(Integer.parseInt(advanced));
      this.save(photoStorage);
      uploadPhotoParam.setPhotoStorageId(photoStorage.getId());
      uploadPhotoParam.setThumbnailsUrl(ThumbnailsUrl);
      return uploadPhotoParam;
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return uploadPhotoParam;
  }

 

核心代码

     <!-- 华为云-->
        <dependency>
            <groupId>com.huaweicloud</groupId>
            <artifactId>esdk-obs-java</artifactId>
            <version>3.20.6.1</version>
        </dependency>
        <!--thumbnailator 压缩工具-->
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.8</version>
        </dependency>
    </dependencies>
 // 创建ObsClient实例
      ObsClient obsClient = new ObsClient(ak, sk, endPoint);
      // 上传网络流。
      InputStream inputStream = file.getInputStream();
      PutObjectResult putObjectResult = obsClient.putObject(bucketName, newFileName, inputStream);
      String Url = putObjectResult.getObjectUrl();
      // 缩略照片上传
      ByteArrayOutputStream os = new ByteArrayOutputStream();
      Thumbnails.of(file.getInputStream()).forceSize(49, 60).toOutputStream(os);
      ByteArrayInputStream ThumbnailsInputStream = ImageUtil.parseToInputStream(os);
      putObjectResult = obsClient.putObject(bucketName, ThumbnailsName, ThumbnailsInputStream);
      String ThumbnailsUrl = putObjectResult.getObjectUrl();

      // 关闭流
      inputStream.close();
      os.close();
      // 关闭obsClient
      obsClient.close();

这边首先创建华为云客户端,然后将照片发送到华为云。然后使用Thumbnails框架,处理照片。再将照片转为流再发送照片到华为云。再缩略图的部分有流转换的过程。

  public static ByteArrayInputStream parseToInputStream(final OutputStream out) throws Exception {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    baos = (ByteArrayOutputStream) out;
    final ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
    baos.close();
    out.close();
    swapStream.close();
    return swapStream;
  }

 

### 华为云 OBS 分段上传实现方法 #### 依赖库引入 为了能够使用华为云OBS的服务,在项目中需加入对应的Java SDK作为依赖。具体来说,应当在项目的构建配置文件(如`pom.xml`对于Maven工程而言)里添加如下依赖项[^2]: ```xml <dependency> <groupId>com.huaweicloud</groupId> <artifactId>esdk-obs-java</artifactId> <version>3.21.12</version> </dependency> ``` #### 初始化OBS客户端 初始化一个ObsClient实例用于后续操作前的准备动作,这一步骤涉及到设置访问密钥(Access Key ID 和 Secret Access Key),以及指定目标区域(Region)的信息。 #### 创建分片并获取Upload Id 当准备好要上传的大文件之后,调用InitiateMultipartUploadRequest接口来启动一个新的多部分上传会话,并从中获得唯一的标识符uploadId以便跟踪整个过程中的各个片段状态变化情况。 #### 数据分割与输 依据实际需求设定每一片的数据量大小(建议范围介于5MB~5GB之间),接着循环读取源文件内容按序号依次发起Part Upload请求直至完成全部数据块送任务;值得注意的是这里实现了断点续机制——即每当遇到网络波动导致连接中断的情形下,程序可以从最后一次成功提交的位置继续而不是重新开始整个流程[^1]。 #### 完成分割后的确认合并 一旦所有预定数量的部分都已经被安全送达云端仓库内,则最后一步就是发送Complete Multipart Upload命令给服务器端告知其可以着手把这些离散单元组合成完整的原始档案副本了。 下面是一份简化版代码示例展示上述逻辑: ```java import com.obs.services.ObsClient; import com.obs.services.model.*; public class ObsMultiPartUploader { private static final String ENDPOINT = "your-endpoint"; private static final String AK = "your-access-key-id"; private static final String SK = "your-secret-access-key"; public void uploadLargeFile(String bucketName, String objectKey, File file){ try (ObsClient obsClient = new ObsClient(ENDPOINT, AK, SK)) { InitiateMultipartUploadResult initResult = obsClient.initiateMultipartUpload(new InitiateMultipartUploadRequest(bucketName, objectKey)); List<PartETag> partEtags = new ArrayList<>(); long fileSize = file.length(); int partSize = 5 * 1024 * 1024; // 设置每个part大小为5MB for(int i=0;i<(fileSize+partSize-1)/partSize;i++){ PartETag etag = uploadPart(obsClient,bucketName,objectKey,file,i*partSize, Math.min(partSize,fileSize-i*partSize),initResult.getUploadId(),i); partEtags.add(etag); } CompleteMultipartUploadRequest completeReq = new CompleteMultipartUploadRequest( bucketName, objectKey, initResult.getUploadId(), partEtags); obsClient.completeMultipartUpload(completeReq); } catch(Exception e){ System.out.println(e.getMessage()); } } private PartETag uploadPart(ObsClient client,String bucketName, String key, File source,long startPos,long sizeToRead, String uploadID,int partNumber)throws Exception{ InputStream stream = null; try{ stream = new FileInputStream(source); stream.skip(startPos); UploadPartRequest request = new UploadPartRequest() .withBucketName(bucketName) .withObjectKey(key) .withInputStream(stream) .withPartSize(sizeToRead) .withPartNumber(++partNumber) .withUploadId(uploadID); return client.uploadPart(request).getETag(); }finally{ if(null != stream){ stream.close(); } } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值