发表于: 2019-12-06 23:44:24

2 1216


今天完成的事:
1、实现千牛云图片上传。
千牛云需要实名注册,成功后测试。
添加千牛云依赖。

而后创建存储空间,需要注意空间的区域与代码有对应。

这个数字需要注意,根据创建空间的区域而定。

另外在不指定key的情况下,会使用文件内容的hash值为文件名称。

下图分别是指定key和未指定的上传文件。
文件上传有两种方式,本地上传和数据流上传,如下。
(1)本地上传
    // 本地文件上传,添加本地文件路径、名称、后缀
    public static void main(String[] args) {
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.region2());
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        //...生成上传凭证,然后准备上传
        String accessKey = "r6NdSnZWPHNMBMX2STXota1WocmCKnZNlDmu7DKK";
        String secretKey = "kZjT9KjAb4ksMUuRZzGAZVEJxrYVD4BvxstdtLvk";
        String bucket = "jnshu-qianniu";
        //如果是Windows情况下,格式是 D:\\qiniu\\test.png
        String localFilePath = "D:\\xzy_log\\task4\\info.log";
//        String localFilePath = "/home/qiniu/test.png";
        //默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = "task/info.log";
//        String key = null;
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);
        try {
            Response response = uploadManager.put(localFilePath, key, upToken);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            System.out.println("上传成功,key值:" + putRet.key);
            System.out.println("上传成功,hash值:" + putRet.hash);
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println("上传失败,异常:" + r.toString());
            try {
                System.err.println("上传失败,异常:" + r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
        }
    }
(2)数据流上传
演示是InputStream对象的上传,适用于所有的InputStream子类。
查看源码可以发现,这里的ByteArrayInputStream就是其子类。
// 数据流上传
public static void main(String[] args) {
    //构造一个带指定 Region 对象的配置类
    Configuration cfg = new Configuration(Region.region2());
    //...其他参数参考类注释
    UploadManager uploadManager = new UploadManager(cfg);
    //...生成上传凭证,然后准备上传
    String accessKey = "r6NdSnZWPHNMBMX2STXota1WocmCKnZNlDmu7DKK";
    String secretKey = "kZjT9KjAb4ksMUuRZzGAZVEJxrYVD4BvxstdtLvk";
    String bucket = "jnshu-qianniu";
    //默认不指定key的情况下,以文件内容的hash值作为文件名
    String key = null;
    try {
        // 数据流上传
        // 这里演示的是InputStream对象的上传,适用于所有的InputStream子类。
        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("上传成功,key值:" + putRet.key);
            System.out.println("上传成功,hash值:" + putRet.hash);
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println("上传失败,异常:" + r.toString());
            try {
                System.err.println("上传失败,异常:" + r.bodyString());
            } catch (QiniuException ex2) {
                //ignore
            }
        }
    } catch (UnsupportedEncodingException ex) {
        //ignore
    }
}
2、编写千牛云工具类。
工具类:
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.apache.log4j.Logger;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.UUID;
public class QianNiuUtil {
    private static Logger logger = Logger.getLogger(QianNiuUtil.class);
    private String accessKey;
    private String secretKey;
    private static String bucketName = "jnshu-qianniu";
    public void setAccessKey(String accessKey) {
        this.accessKey = accessKey;
    }
    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }
    public String qianNiuUpload(MultipartFile multipartFile) {
        // 构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.region2());
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        String imgUrl = null;
        try {
            // 数据流上传,将 MultipartFile 转为 InputStream,适用于所有的InputStream子类。
            byte[] uploadBytes = multipartFile.getBytes();
            ByteArrayInputStream byteInputStream=new ByteArrayInputStream(uploadBytes);
            // 使用 UUID 给图片重命名,并去掉四个“-”
            String name = UUID.randomUUID().toString().replaceAll("-", "");
            // 获取图片名称
            String ext = multipartFile.getOriginalFilename();
            // 获取图片的后缀名称,含“.”
            String suffix = ext.substring(ext.lastIndexOf("."));
            String photoName = name + suffix ;
            // 默认不指定key的情况下,以文件内容的hash值作为文件名
            String key = "image/" + photoName;
            Auth auth = Auth.create(accessKey, secretKey);
            String upToken = auth.uploadToken(bucketName);
            Response response = uploadManager.put(byteInputStream, key, upToken,null, null);
            // 解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            logger.info("上传成功,key值:" + putRet.key);
            logger.info("上传成功,hash值:" + putRet.hash);
            imgUrl="http://q22kto9i4.bkt.clouddn.com/" + key;
            } catch (QiniuException ex) {
                Response r = ex.response;
                logger.error("上传失败,异常1:" + r.toString());
                try {
                    logger.error("上传失败,异常2:" + r.bodyString());
                } catch (QiniuException ex2) {
                    logger.error("上传失败,异常3:" + ex2.getMessage());
                }
            } catch (IOException e) {
            logger.error("上传失败,异常4:" + e.getMessage());
        }
        return imgUrl;
    }
}
spring全局配置:
<!--七牛云初始化设置,用set注入的方式,常用 -->
<bean id="qianNiuUtil"  class="com.jnshu.util.QianNiuUtil">
    <property name="accessKey" value="r6NdSnZWPHNMBMX2STXota1WocmCKnZNlDmu7DKK"></property>
    <property name="secretKey" value="kZjT9KjAb4ksMUuRZzGAZVEJxrYVD4BvxstdtLvk"></property>
</bean>
测试接口:
    // 上传头像,千牛云
    @RequestMapping(value = "/upPhoto", method = RequestMethod.POST)
    public String uploadByQianNiu(MultipartFile multipartFile) {
        Map<String,Object> map = new HashMap();
        String photoPath = qianNiuUtil.qianNiuUpload(multipartFile);
        if( photoPath !=null && !"".equals(photoPath)){
            map.put("code","1");
            map.put("message","上传头像成功");
            map.put("data",photoPath);
            logger.info("头像地址:" + photoPath);
            logger.info("上传头像成功");
        }else {
            map.put("code","0");
            map.put("message","上传头像失败");
            map.put("data",null);
            logger.info("上传头像失败");
        }
        return "login";
    }
3、阿里云防盗链。
查看阿里云的防盗链,在存储空间的基础设置中。设置Referer白名单,这里随便添加了一个。是否允许空Referer暂时用默认的允许。
Referer是HTTP请求header的一部分,当浏览器(或模拟浏览器行为)向web服务器发送请求时,头信息里包含Referer,它表示一个来源。
作用是指示一个请求是从哪里链接来的,当一个请求并不是链接触发的,自然就不需要指示请求的连接来源,比如直接在浏览器地址栏输入url地址,这种请求不会包含Referer字段,因为http请求不是从一个地方链接过去的,而是“凭空生成”的。这就是允许为空Referer。

所以目前的设置就是,允许浏览器地址栏直接输入url访问文件,如果是从某处链接访问,就必须含有设置的Referer字段。

所以这里在控制台查看文件详情的时候,直接打开文件url无法访问,必须要复制url,单独在浏览器地址栏输入才能访问。

直接打开文件URL,访问失败。

复制url,单独在浏览器地址栏输入,才能访问、下载文件。但是这里按照这个url只能下载,没法浏览器直接查看图片。。
将允许空Referer设置为不允许。
复制url直接用浏览器访问也会报错。
这里设置白名单后,在控制台预览也无法查看。
按照提示,添加了对应的“ *.console.aliyun.com”,就可以预览查看了。
4、阿里云图片处理-缩略图

新建样式,修改设置。

选择30%等比缩小。
使用url下载图片有两种方式,这里还只能是下载,不能直接查看图片。。
(1)在文件后缀,如“.jpg”,后面添加“?x-oss-process=”,再加对应样式的代码,此处:“image/auto-orient,1/resize,p_30/quality,q_90”。
(2)同上,只是对应样式代码处,改为对应样式的名称,此处:style/30suoluetu”。
下图是原图以及缩略图对比。
这里需要注意要将bucket的权限设为公共读,如果是私有的话会默认有超时设置,那时的图片url会有变化。
因为打开url总是下载文件,这里没找到解决方法,询问师兄,原来是阿里默认有强制下载的设置,需要修改http头的content-type才能改为直接查看图片。
将http头的content-type修改为image即可,访问url直接观看图片,而不是下载。
但是再次上传还是默认的http头。所以还需要查看下彻底的解决办法,明天看看。
修改后的可以直接url查看图片。
明天计划的事:
1、解决今天的阿里云图片强制下载问题。
2、查看图片迁移。
3、使用maven命令打包容联sdk的jar包。
4、学习ajax,简单建立验证所需页面。
遇到的问题:
阿里云图片上传后,输入url只能下载,无法直接浏览器查看,询问师兄,可以单独设置,但是再次上传的图片还是无法查看,明天找下答案。
收获:
1、实现千牛云上传图片,并编写接口。
2、查看阿里云防盗链、图片处理中的缩略图。

返回列表 返回列表
评论

    分享到