发表于: 2019-12-06 23:44:24
2 1212
今天完成的事:
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、查看阿里云防盗链、图片处理中的缩略图。
评论