首先配置好ssm的基本环境,可参考
https://blog.csdn.net/liqian_yu/article/details/108115480.
pom.xml 中要配置依赖
<!--用于照片上传的七牛云服务器 -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.2.2</version>
</dependency>
我们要有文件上传的ajaxfileupload.js插件,这个js插件在网上可以下载,配置好文件上传的ajax方法,以下局部代码可以参考在这里插入代码片
$.ajaxFileUpload({
url : '${pageContext.request.contextPath}/qiniu/upload',//用于文件上传的服务器端请求地址
secureuri : false,//一般设置为false
fileElementId : 'file',//文件上传空间的id属性 <input type="file" id="file" name="file" />
dataType : 'json',//返回值类型 一般设置为json
success : function(data, status) {//服务器成功响应处理函数
var imgObj = $("<img>");
imgObj.attr("src", data.resultString);
imgObj.attr("width", "30px");
imgObj.attr("height", "30px");
$("#imgDiv").html("");
$("#imgDiv").append(imgObj);
$("#image").val(data.resultString);
},
error : function(data, status, e) {//服务器响应失败处理函数
alert(status);
alert(e);
}
});
我们在${pageContext.request.contextPath}/qiniu/upload下收到post请求,在控制器代码如下
package com.zzti.controller;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.zzti.util.QiniuCloudUtil;
import com.zzti.util.Result;
@Controller
public class QiNiuUploadController {
@RequestMapping(value="qiniu/upload",method = RequestMethod.POST)
@ResponseBody
public Result upFile(MultipartFile file, HttpServletRequest request) {
//获取图片上传的名称,比如car.jpg
String orinalName = file.getOriginalFilename();
//获取图片上传的扩展名.jpg
String suffixName = orinalName.substring(orinalName.indexOf("."));
Result rs = new Result();//
//文件为空响应为:上传图片为空
if (file.isEmpty()) {
rs.setCode(500);
rs.setResultBoolean(false);
rs.setResultMessage("上传图片为空");
return rs;
}
try {
byte[] bytes = file.getBytes();
//使用uuid替代原来的名称,避免上传的文件同名时无法区分sdgdfg-fgdfgdf-gfhf.jpg
String imageName = UUID.randomUUID().toString()+suffixName;
//使用七牛工具类上传图片
QiniuCloudUtil qiniuUtil = new QiniuCloudUtil();
//使用base64方式上传到七牛云
String url = qiniuUtil.put64image(bytes, imageName);//qfcc4anm8.hd-bkt.clouddn.comsdgdfg-fgdfgdf-gfhf.jpg
url = url.split(".com")[0] + ".com/" + url.split(".com")[1];//qfcc4anm8.hd-bkt.clouddn.com/sdgdfg-fgdfgdf-gfhf.jpg
rs.setCode(200);
rs.setResultBoolean(true);
rs.setResultMessage("上传图片成功");
//上传成功返回七牛云云服务器上图片的url地址,并且将该地址保存到customer表中
rs.setResultString("http://"+url);//http://qfcc4anm8.hd-bkt.clouddn.com/sdgdfg-fgdfgdf-gfhf.jpg
return rs;
} catch (Exception e) {
rs.setResultBoolean(false);
rs.setCode(500);
rs.setResultMessage("上传图片异常");
return rs;
}
}
}
*[Result]:实体类,下面会给出代码
*[QiniuCloudUtil]:工具类,下面会给代码
Result实体类:
package com.zzti.util;
public class Result {
private String resultMessage;
private Integer code;
private Boolean resultBoolean;
private String resultString;//上传的图片url地址,保存到数据库
public String getResultMessage() {
return resultMessage;
}
public void setResultMessage(String resultMessage) {
this.resultMessage = resultMessage;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Boolean getResultBoolean() {
return resultBoolean;
}
public void setResultBoolean(Boolean resultBoolean) {
this.resultBoolean = resultBoolean;
}
public String getResultString() {
return resultString;
}
public void setResultString(String resultString) {
this.resultString = resultString;
}
}
QiniuCloudUtil:工具类,只需要按照自己的内容修改,zone0(服务器中文件夹地区),ACCESS_KEY,String SECRET_KEY,bucketname(这是自己空间里的包名),DOMAIN(这是自己空间的外链地址),其他不需要改
package com.zzti.util;
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.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 java.io.IOException;
public class QiniuCloudUtil {
//构造一个带指定Zone对象,这里zone0代表的是文件夹华东地区的配置类
private static final Configuration cfg = new Configuration(Zone.zone0());
// 设置需要操作的账号的AK和SK,如果自己注册成功后可以修改为你自己注册的AK和SK信息
private static final String ACCESS_KEY = "AQz0zpQTe20YXxk2FMKletdRnX-BfEuGyJnhA";
private static final String SECRET_KEY = "U9U7juqrySdnMGEtyWapi8fbsbm6AmpA9";
// 要上传的空间,,如果自己注册成功后可以修改为你自己注册的传的空间信息,这是自己空间里的包名
private static final String bucketname = "lingyigemingzi";
// 密钥
private static final Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
//这是自己空间的外链地址
private static final String DOMAIN = "qfcdddovx.hd-bkt.clouddn.com";
private static final String style = "";
public String getUpToken() {
return auth.uploadToken(bucketname, null, 3600, new StringMap().put("insertOnly", 1));
}
// 普通上传
public String upload(String filePath, String fileName) throws IOException {
// 创建上传对象
UploadManager uploadManager = new UploadManager(cfg);
try {
// 调用put方法上传
String token = auth.uploadToken(bucketname);
/*
if(UtilValidate.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 + "?" + 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 put64image(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 + "?" + style;
}
class Ret {
public long fsize;
public String key;
public String hash;
public int width;
public int height;
}
}
最后存储的路径和文件名字就是实体类中resultString的值!