java图片上传七牛云服务器

七牛云地址

实名认证:上传身份证信息等

上传图片:

1.对象存储
在这里插入图片描述

2.新建一个存储空间
在这里插入图片描述

3.建好存储空间后内容管理
在这里插入图片描述

4.默认外链(将于2018-08-22起改版,一个月有效期,可以在测试环境中使用)
在这里插入图片描述

5.自定义外链(可以用很久)
在这里插入图片描述
在这里插入图片描述

此处可以填一个随便前缀的域名,比如你自己有个已经备案的域名www.baidu.com,此处填的加速域名就是换个随便的前缀即可,例如:imgs.baidu.com
然后其余默认配置不用改,直接下拉点击创建即可。
在这里插入图片描述

接下来要去解析域名,可以在阿里云解析,先拿到这个域名的cname
在这里插入图片描述

解析的时候,主机名称为那个前缀,记录值为cname
记录类型 CNAME
主机记录
记录值
参考:https://blog.csdn.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;
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值