怎么上传图片到阿里云OSS中并限制图片的大小且用MD5校验和命名文件??

本文档介绍了如何在Spring Boot应用中集成Spring Cloud Alibaba的OSS Starter,配置阿里云OSS服务,并创建一个工具类、Service接口及其实现类,用于文件上传。通过MultipartFile接收文件,然后利用阿里云OSS SDK进行文件上传,同时校验文件的MD5值,确保上传一致性。最后提供了一个RESTful API用于接口调用。
摘要由CSDN通过智能技术生成
  • 导入POM依赖
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alicloud-oss</artifactId>
     <version>2.2.0.RELEASE</version>
</dependency>
  • Spring Boot 的properties.yml配置
Spring:
  cloud:
    alicloud:
      access-key: 
      secret-key: 
      oss:
        endpoint: oss-cn-hangzhou.aliyuncs.com
        bucketname:
  • 创建OSS工具类
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class OssUtil implements InitializingBean {
    @Value("${spring.cloud.alicloud.oss.endpoint}")
    private String endpoint;
    @Value("${spring.cloud.alicloud.access-key}")
    private String accessKeyID;
    @Value("${spring.cloud.alicloud.secret-key}")
    private String accesskeySecret;
    @Value("${spring.cloud.alicloud.oss.bucketname}")
    private String bucketName;

    public static String END_POINT;
    public static String ACCESS_KEY_ID;
    public static String ACCESS_KEY_SECRET;
    public static String BUCKET_NAME;

    //编写一个工具类,读取配置文件,其中InitializingBean是为了复制给public静态变量,afterPropertiesSet()会在容器加载完后执行。
    @Override
    public void afterPropertiesSet() throws Exception {
        END_POINT = endpoint;
        ACCESS_KEY_ID = accessKeyID;
        ACCESS_KEY_SECRET = accesskeySecret;
        BUCKET_NAME = bucketName;
    }

}
  • 创建OSS 的Service接口
import org.springframework.web.multipart.MultipartFile;

public interface OssService {
    String uploadFile(MultipartFile file);
}
  • 实现类
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectResult;
import com.kiseki.service.OssService;
import com.kiseki.util.OssUtil;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

@Service
@Slf4j
public class OssServiceImpl implements OssService {


    @Override
    public String uploadFile(MultipartFile file) {
        //赋值
        String url = null;
        String endpoint = OssUtil.END_POINT;
        String accessKeyId = OssUtil.ACCESS_KEY_ID;
        String accessKeySecret = OssUtil.ACCESS_KEY_SECRET;
        String bucketName = OssUtil.BUCKET_NAME;
        //建立oss连接,通过地址和密钥
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {
            //需要2个流,1个流给MD5处理,一个流为了上传到Oss。https://blog.csdn.net/xueyijin/article/details/121526772
            InputStream inputStream = file.getInputStream();
            //以下思路是创建一个输出流来缓存
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer)) > -1) {
                baos.write(buffer, 0, len);
            }
            baos.flush();
            String md5 = DigestUtils.md5DigestAsHex(baos.toByteArray());
            log.info("md5:{}", md5);//可以看出这也是md5
            InputStream inputStreamForMD5 = new ByteArrayInputStream(baos.toByteArray());
            InputStream inputStreamForOss = new ByteArrayInputStream(baos.toByteArray());
            /*其实用下面这个也是一样的,但是哪个更高效和通用???
            InputStream inputStreamForMD5 = file.getInputStream();
            InputStream inputStreamForOss = file.getInputStream();
             */
            //获取上传的文件的名字
            String filename = file.getOriginalFilename();
            //获得后缀
            String fileSuffix = filename.substring(file.getOriginalFilename().lastIndexOf("."));
            //随机uuid是为了拼接文件名,防止用户上传两个名字相同的文件后覆盖掉前一个
            //UUID uuid = UUID.randomUUID();
            //获取一个md加密
            String md5OfFileName = DigestUtils.md5DigestAsHex(inputStreamForMD5);
            //这里是为了按上传时间分配目录。精确到月,这里用到一个第三方的jar包,记得笔记2022/5/18
            String dateMark = DateTime.now().toString("yyyyMMdd/");
            //拼接成完整的文件名。
            final String uploadKey = dateMark + md5OfFileName + fileSuffix;
            log.info("uploadKey:{}", uploadKey);
            //传入三个参数,上传
            PutObjectResult putObjectResult = ossClient.putObject(bucketName, uploadKey, inputStreamForOss);
            //阿里云返回eTag为全大写的md5值
            String eTag = putObjectResult.getETag();
            log.info("eTag:{}", eTag);
            //拼接url,这个就是地址
            url = "https://" + bucketName + "." + endpoint + "/" + uploadKey;
            log.info("Image URL:{}", url);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            ossClient.shutdown();
        }
        return url;
    }
}
  • 接口代码:
import com.kiseki.service.OssService;
import com.kiseki.vo.ApiResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("api/Upload")
@Api(tags = "上传数据接口")
@Validated
@Slf4j
@CrossOrigin
public class UploadAPI {
    @Autowired
    OssService ossService;

    @ApiOperation(value = "上传图片", notes = "图片需为jpg,jpeg,gif,png格式。")
    @PostMapping("/OssImage")
    public ApiResponse uploadImage(@RequestPart("图片") MultipartFile image) {
        if (image.getSize() > 1024 * 1024 * 5) {
            return ApiResponse.fail("附件大小不能大于5M");
        }
        //下面判断,图片的格式需要是jpg,jpeg,gif,png格式
        String pictureSuffix = image.getOriginalFilename().substring(image.getOriginalFilename().lastIndexOf(".") + 1);
        if (!"jpg,jpeg,gif,png".toUpperCase().contains(pictureSuffix.toUpperCase())) {
            return ApiResponse.fail("请选择jpg,jpeg,gif,png格式的图片");
        }
        return ApiResponse.success(ossService.uploadFile(image));
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue3是一种流行的JavaScript框架,用于构建用户界面。它具有响应式数据绑定、组件化开发和虚拟DOM等特性,使得开发者可以更高效地构建交互式的Web应用程序。 要在Vue3实现上传图片阿里云OSS,你可以按照以下步骤进行操作: 1. 安装依赖:首先,你需要安装阿里云OSS的JavaScript SDK。可以使用npm或yarn命令来安装,例如: ``` npm install ali-oss ``` 2. 配置OSS客户端:在Vue3的代码,你需要创建一个OSS客户端实例,并配置相关参数,如AccessKeyId、AccessKeySecret、Endpoint等。这些参数可以在阿里云OSS控制台获取。 3. 创建上传组件:在Vue3,你可以创建一个上传组件,用于选择图片文件并触发上传操作。可以使用`<input type="file">`元素来实现文件选择功能,并监听其`change`事件。 4. 上传图片:在上传组件,你可以编写上传图片的逻辑。当用户选择了图片文件后,你可以通过OSS客户端调用`put`方法来上传图片文件阿里云OSS。 下面是一个简单的示例代码,演示了如何在Vue3上传图片阿里云OSS: ```javascript <template> <div> <input type="file" @change="handleFileChange"> </div> </template> <script> import OSS from 'ali-oss'; export default { methods: { handleFileChange(event) { const file = event.target.files[0]; const client = new OSS({ accessKeyId: 'your-access-key-id', accessKeySecret: 'your-access-key-secret', bucket: 'your-bucket-name', region: 'your-oss-region', // 其他配置参数... }); // 生成唯一的文件名 const fileName = Date.now() + '-' + file.name; // 调用OSS客户端的put方法上传文件 client.put(fileName, file).then(response => { console.log('上传成功', response); // 在这里可以处理上传成功后的逻辑 }).catch(error => { console.error('上传失败', error); // 在这里可以处理上传失败后的逻辑 }); } } } </script> ``` 请注意,上述代码的`your-access-key-id`、`your-access-key-secret`、`your-bucket-name`和`your-oss-region`需要替换为你自己的阿里云OSS相关信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值