java图片上传七牛云服务器
七牛云地址
实名认证:上传身份证信息等
上传图片:
1.对象存储
2.新建一个存储空间
3.建好存储空间后内容管理
4.默认外链(将于2018-08-22起改版,一个月有效期,可以在测试环境中使用)
5.自定义外链(可以用很久)
此处可以填一个随便前缀的域名,比如你自己有个已经备案的域名www.baidu.com,此处填的加速域名就是换个随便的前缀即可,例如:imgs.baidu.com
然后其余默认配置不用改,直接下拉点击创建即可。
接下来要去解析域名,可以在阿里云解析,先拿到这个域名的cname
解析的时候,主机名称为那个前缀,记录值为cname
记录类型 CNAME
主机记录
记录值
参考:https://blog.****.net/flyinglxr/article/details/78639410
6.解析成功后就可以使用外链了
7.以下就是java代码了
Controller层
package com.zero.jimu.controller;
import com.zero.jimu.utils.qiniu.QiniuCloudUtil;
import com.zero.jimu.utils.qiniu.FileTypeHelper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.util.*;
@Controller
@RequestMapping("/file")
public class Up_download {
/**
* 批量上传图片到七牛并返回url地址
* @param items 图片数组
* @return
*/
@ResponseBody
@PostMapping(value="/uploadImg")
public Map<String,Object> uploadImg(@RequestParam MultipartFile[] items) {
Map<String,Object> map = new HashMap<>();
int i = 0;//记录文件上传成功数
int j = 0;//记录文件上传失败数
try {
List<String> list = new ArrayList();
if(items.length>0){
for(MultipartFile file: items){
byte[] bytes = file.getBytes();
//判断文件是否为图片(JPG或PNG)
if(FileTypeHelper.isImage(bytes)){
String imageName = UUID.randomUUID().toString();
QiniuCloudUtil qiniuUtil = new QiniuCloudUtil();
//使用base64方式上传到七牛云
String url = qiniuUtil.put64(bytes, imageName);
i++;
list.add(url);
}else{
j++;
}
}
map.put("code","00000000");
map.put("message","共"+items.length+"个文件,"+i+"个文件上传成功,"+j+"个文件上传失败");
map.put("url",list);
}else{
map.put("code","00000001");
map.put("message","文件为空,请重新上传");
}
} catch (Exception e) {
e.printStackTrace();
map.put("code","00000001");
map.put("message","文件上传发生异常!");
}
return map;
}
/**
* 删除文件
* @param url 文件外链
* @return
*/
@ResponseBody
@PostMapping(value="/delete")
public Map<String,Object> delete(String url) {
Map<String,Object> map = new HashMap<>();
QiniuCloudUtil qiniuUtil = new QiniuCloudUtil();
try {
int i = qiniuUtil.delete(url);
if(i==1){
map.put("code","00000000");
map.put("message","文件删除成功");
}else{
map.put("code","00000001");
map.put("message","文件不存在");
}
}catch (Exception e){
map.put("code","00000001");
map.put("message","文件不存在");
}
return map;
}
}
8.七牛云工具包
package com.zero.jimu.utils.qiniu;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.util.Auth;
import com.qiniu.util.Base64;
import com.qiniu.util.StringMap;
import com.qiniu.util.UrlSafeBase64;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import org.springframework.util.StringUtils;
import java.io.IOException;
/**
* 七牛云工具类
*/
public class QiniuCloudUtil {
class Ret {
public long fsize;//文件大小,单位为字节(Byte)
public String key;//文件存储的key,不传则使用文件hash作为key,目标资源的最终名字,可由七牛云存储自动命名
public String hash;//文件的HASH值,使用hash值算法计算
public int width;
public int height;
}
// 设置需要操作的账号的AK和SK
private static final String ACCESS_KEY = "你的ACCESS_KEY";//你的ACCESS_KEY
private static final String SECRET_KEY = "你的SECRET_KEY";//你的SECRET_KEY
// 要上传的空间
private static final String bucketname = "你的空间名称";//你的空间名称
// **配置
private static final Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
private static final String DOMAIN = "你的文件上传路径";//你的文件上传路径
private static final String style = "imageView2/0/q/100";//自定义的图片样式
//获取上传凭证
public String getUpToken() {
return auth.uploadToken(bucketname, null, 3600, new StringMap().put("insertOnly", 1));//新增模式上传策略
}
// 普通上传
public String upload(String filePath, String fileName) throws IOException {
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
// 创建上传对象
UploadManager uploadManager = new UploadManager(cfg);
try {
// 调用put方法上传
String token = auth.uploadToken(bucketname);
if(StringUtils.isEmpty(token)) {
System.out.println("未获取到token,请重试!");
return null;
}
Response res = uploadManager.put(filePath, fileName, token);
// 打印返回的信息
//System.out.println(res.bodyString());
if (res.isOK()) {
Ret ret = res.jsonToObject(Ret.class);
//如果不需要对文件(图片)进行样式处理,则使用以下方式即可
//return DOMAIN + ret.key;
return DOMAIN + ret.key;//DOMAIN + key + "?" + style
}
} catch (QiniuException e) {
Response r = e.response;
// 请求失败时打印的异常的信息
System.out.println(r.toString());
try {
// 响应的文本信息
System.out.println(r.bodyString());
} catch (QiniuException e1) {
// ignore
}
}
return null;
}
//base64方式上传
public String put64(byte[] base64, String key) throws Exception{
String file64 = Base64.encodeToString(base64, 0);
Integer l = base64.length;
String url = "http://upload.qiniu.com/putb64/" + l + "/key/"+ UrlSafeBase64.encodeToString(key);
//非华东空间需要根据注意事项 1 修改上传域名
RequestBody rb = RequestBody.create(null, file64);
Request request = new Request.Builder().
url(url).
addHeader("Content-Type", "application/octet-stream")
.addHeader("Authorization", "UpToken " + getUpToken())
.post(rb).build();
//System.out.println(request.headers());
OkHttpClient client = new OkHttpClient();
okhttp3.Response response = client.newCall(request).execute();//将文件保存在七牛云中
//System.out.println(response);
//如果不需要添加文件(图片)样式,使用以下方式
//return DOMAIN + key;
return DOMAIN + key;//DOMAIN + key + "?" + style
}
// 普通删除
public int delete(String key) throws IOException {
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone0());
int i = 0;
// 实例化一个BucketManager对象
BucketManager bucketManager = new BucketManager(auth,cfg);
// 此处的33是去掉:http://pcq1fv2bt.bkt.clouddn.com/,剩下的key就是文件在七牛云的名称
key = key.substring(33);
try {
FileInfo fileInfo = bucketManager.stat(bucketname, key);
if(fileInfo!=null){
// 调用delete方法移动文件
bucketManager.delete(bucketname, key);
i = 1;
}
} catch (QiniuException e) {
// 捕获异常信息
Response r = e.response;
System.out.println(r.toString());
}
return i;
}
}
9.文件校验包
package com.zero.jimu.utils.qiniu;
import org.springframework.util.Assert;
import java.util.Arrays;
public class FileTypeHelper{
/**
* 判断是否为图片,是图片返回true,否则返回false
*
* @param buff
* @return 图片返回true,否则返回false
*/
public static boolean isImage(byte[] buff){
FileType type = getType(buff);
return FileType.JPEG.equals(type)||FileType.PNG.equals(type);
}
public static FileType getType(byte[] buff){
Assert.isTrue(buff!=null &&buff.length>28);
byte[] bytes= Arrays.copyOfRange(buff, 0, 28);
String magic = bytesToHex(bytes);
for(FileType type:FileType.values()){
if(magic.startsWith(type.getValue())) return type;
}
return null;
}
private static String bytesToHex(byte[] src) {
StringBuilder stringBuilder = new StringBuilder();
if (src == null || src.length <= 0) return null;
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString().toUpperCase();
}
}
10.定义文件类型的枚举
package com.zero.jimu.utils.qiniu;
/**
* 定义文件类型及其对应魔数
*/
public enum FileType {
JPEG("FFD8FF"),
PNG("89504E47"),
GIF("47494638");
private String value = "";
private FileType(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}