java上传图片到阿里云OSS对象存储

之前项目的图片是上传后保存在本地E盘的,在本地运行的时候简直完美,但等到用内网穿透访问或部署到服务器上后再访问,那1M的小水管要加载半天才能加载出来图片。原本无可奈何,结果突然发现买服务器时送了6个月的40G OSS存储包,这不是美滋滋吗,赶紧把之前的图片上传进去,然后把数据库里的路径全部加上OSS域名,再一试,速度飞起。结果我发现事情没这么简单,存储包是送的,但是流量要钱的[哭]。但是数据库里路径都改了,虽然有备份,但是用OSS来访问那个速度让我不想放弃。于是用了一会儿看了看价格。访问我的项目全部页面3次,虽然流量70多Mb,但是才一分钱。本穷逼可以接受。

那就把文件上传接口改了吧。由于我只需要将图片上传到OSS,并不需要做其他删除等操作,所以还是比较简单的。

首先导入依赖

<!--阿里上传文件到OSS存储依赖-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.8.0</version>
        </dependency>

上传图片请求

@RestController
public class FileControllerToOSS {
    @PostMapping({"/upLoadImg/{type}"})
    public JSONObject upLoadImg(@RequestParam("file") MultipartFile file, @PathVariable("type") String type) throws Exception{
        if (!CheckSession.checkSession()){
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("code",1);
            return jsonObject;
        } else {
            /*获取当前登录的用户id*/
            Integer userId = GetUserId.getUserId();
            String fileName = file.getOriginalFilename(); //获取原始路径
            fileName = fileName.substring(fileName.lastIndexOf("\") + 1); //获取文件&后缀名
            String suffixName = fileName.substring(fileName.lastIndexOf(".")); //获取后缀名

            String name = userId + Now.getNowTime("yyyyMMddHHmmss")+fileName;
            String completePath = "userImages/"+ type+"/" + name;

            // Endpoint以杭州为例,其它Region请按实际情况填写。
            String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
            String accessKeyId = "";
            String accessKeySecret = "";
            InputStream inputStream = file.getInputStream();

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

// 创建PutObjectRequest对象。
//            PutObjectRequest putObjectRequest = new PutObjectRequest("", "", new File(""));

// 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);

// 上传文件。
            ossClient.putObject("", completePath, inputStream);

// 关闭OSSClient。
            ossClient.shutdown();
            String src = ""+completePath;
            JSONObject srcJson = new JSONObject();
            srcJson.put("src",src);
            JSONObject json = new JSONObject();
            json.put("code",0);
            json.put("msg","上传成功");
            json.put("data",srcJson);
//        System.out.println(json);
            return json;
        }
    }
}

官方的文档已经比较详细,这里我将自己的那些key和url等删除了,按照官方的填入自己的即可

经验分享 程序员 微信小程序 职场和发展