目录
图片服务器有很多:阿里云的OSS、七牛云的 Kodo和腾讯云的COS,这里介绍的是七牛云的kodo
七牛云网址:
https://portal.qiniu.com/kodo/bucket
先是注册、登录、认证,步骤很多
创建
点击对象存储Kodo
点击空间管理,新建空间
新建存储空间
存储区域选离自己近点的,选公开这样别人访问时也可以看到
这样就创建成功了
点右上角的文档---开发者中心
点击对象存储
我选的Java SDK
我用的maven,选maven
复制粘贴到自己的项目中
然后刷新一下
选择文件上传的数据流上传
新建一个测试类测试
package com.ecjtu.test;
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import org.junit.Test;
import com.qiniu.storage.Configuration;
import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
public class OSSTest {
@Test
public void test(){
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.region0());
cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
String accessKey = "your access key";
String secretKey = "your secret key";
String bucket = "your bucket name";
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = null;
try {
byte[] uploadBytes = "hello qiniu cloud".getBytes("utf-8");
ByteArrayInputStream byteInputStream=new ByteArrayInputStream(uploadBytes);
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try {
Response response = uploadManager.put(byteInputStream,key,upToken,null, null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
} catch (QiniuException ex) {
ex.printStackTrace();
if (ex.response != null) {
System.err.println(ex.response);
try {
String body = ex.response.toString();
System.err.println(body);
} catch (Exception ignored) {
}
}
}
} catch (UnsupportedEncodingException ex) {
//ignore
}
}
}
需要改内容
获取密钥
点击密钥管理
获取之后粘贴到这里
用下面这种方式简单测试一下
输出了两行东西,没报错
查看七牛云,key没有命名,就是hash值
可以固定key值
这次也是可以查看到的
创建一个目录把图片放进去,也是改key
再去七牛云查看也可以
用到自己的项目:
测试完成,下面就可以用到自己的项目了
文件上传的方法:
/*
* 新增
* */
@RequestMapping(value = "create.action")
@ResponseBody
public Message createPet(Pet pet,@RequestParam(value = "file") MultipartFile file) throws IOException {
//图片
//String load = FileLoad.load(file);
String load = UploadController.uploadImg(file);
System.out.println("load"+load);
pet.setPic(load);
if(petService.addPet(pet)>0){
return Message.success();
}else{
return Message.fail();
}
}
UploadController
package com.ecjtu.controller;
import com.ecjtu.service.UploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
public class UploadController {
private static UploadService uploadService;
// 构造器注入
@Autowired
public UploadController(UploadService uploadService) {
this.uploadService = uploadService;
}
@PostMapping("/upload")
public static String uploadImg(MultipartFile img){
return uploadService.uploadImg(img);
}
}
UploadService
package com.ecjtu.service;
import org.springframework.web.multipart.MultipartFile;
public interface UploadService {
String uploadImg(MultipartFile img);
}
UploadServiceImpl
package com.ecjtu.service.impl;
import com.ecjtu.service.UploadService;
import com.ecjtu.util.PathUtils;
import com.ecjtu.util.QiniuUtils;
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import org.omg.CORBA.SystemException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
@Service
public class UploadServiceImpl implements UploadService {
@Override
public String uploadImg(MultipartFile img) {
//判断文件类型或者文件大小
//获取原始文件名
String originalFilename = img.getOriginalFilename();
String filePath = PathUtils.generateFilePath(originalFilename);
String url = uploadOss(img,filePath); // 2024/8/19/uuid.png
return url;
}
String accessKey = "xxx";
String secretKey = "xxx";//自己的密钥
String bucket = "liulangmaogouimg";//刚才创建的名字
private String uploadOss(MultipartFile imgFile, String filePath) {
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.autoRegion());
cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = filePath;
try {
InputStream inputStream = imgFile.getInputStream();
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try {
Response response = uploadManager.put(inputStream, key, upToken, null, null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
return "http://spx07o3ti.hb-bkt.clouddn.com/"+key;//自己的域名
} catch (QiniuException ex) {
ex.printStackTrace();
if (ex.response != null) {
System.err.println(ex.response);
try {
String body = ex.response.toString();
System.err.println(body);
} catch (Exception ignored) {
}
}
}
} catch (Exception ex) {
//ignore
}
return "www";
}
}
PathUtils工具类
package com.ecjtu.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
public class PathUtils {
public static String generateFilePath(String fileName) {
//根据日期生成路径 2022/1/15/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
String datePath = sdf.format(new Date());
//uuid作为文件名
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//后缀和文件后缀一致
int index = fileName.lastIndexOf(".");
// test.jpg -> .jpg
String fileType = fileName.substring(index);
return new StringBuilder().append(datePath).append(uuid).append(fileType).toString();
}
}