完成了多表联查和数据插入(后面准备 多表联合的更新)
今天准备完成集成文件上传模块
主要是实现图片上传(用户头像的上传)
开始整合流程
添加依赖(阿里的和七牛的一起添加了)
com.aliyun.oss
aliyun-sdk-oss
2.8.3
com.qiniu
qiniu-java-sdk
7.2.11
compile
com.squareup.okhttp3
okhttp
3.3.1
compile
com.google.code.gson
gson
2.6.2
compile
com.qiniu
happy-dns-java
0.1.4
compile
(编写SQL语句)
update u_user
set
head_picture = #{head_picture,jdbcType=VARCHAR}
where id = #{id,jdbcType=BIGINT}
本次使用七牛云图片存储(后面再加一个阿里云的OSS)
接下来就是核心API接口
public class QIniuUpload {
//设置好账号的ACCESS_KEY和SECRET_KEY
String ACCESS_KEY = "XXXXXX";
String SECRET_KEY = " XXXXXX ";
//要上传的空间
String bucketname = " XXXXXX ";
//上传到七牛后保存的文件名
//String key = "head_fv_.png";
//上传文件的路径
// String FilePath = "D:\\Code_Audit_360\\Windows壁纸\\星空.jpg";
private String CDN_DOMAIN_NAME =" XXXXXX ";
//上传根目录
private String IMG_UPLOAD_PATH = "";
//第二种方式: 自动识别要上传的空间(bucket)的存储区域是华东、华北、华南。
private Zone z = Zone.autoZone();
private Configuration c = new Configuration(z);
//创建上传对象
private UploadManager uploadManager = new UploadManager(c);
public String uploadImg2QiNiu(MultipartFile file) throws IOException {
//SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH:mm:ss.SSS");
String name_file = CharacterUtils.getRandomString2(8);//随机数
String key = IMG_UPLOAD_PATH +name_file+"fv_.png";
try {
Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
String upToken = auth.uploadToken(bucketname);
Response response = uploadManager.put(file.getInputStream(), key, upToken,null, null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
return CDN_DOMAIN_NAME + putRet.key;
} catch (QiniuException e) {
Response r = e.response;
// 请求失败时打印的异常的信息
//System.out.println(r.toString());
try {
// 响应的文本信息
System.out.println(r.bodyString());
} catch (QiniuException qe) {
e.printStackTrace();
}
return "上传图片异常!";
}
}
}
control层
//文件上传
@RequestMapping(value = "upload",method=RequestMethod.POST)
@ResponseBody
public Map upload(HttpServletRequest request, MultipartFile file)throws Exception {
resultMap.put("status", 400);
if (checkSuffix(file.getOriginalFilename())) {
QIniuUpload qIniuUpload = new QIniuUpload();
String head = qIniuUpload.uploadImg2QiNiu(file);
System.out.println(head);
UUser user = new UUser(head,TokenManager.getToken().getId());
userService.upload(user);
System.out.println("gooood");
resultMap.put("message", "头像上传成功!");
resultMap.put("status", 200);
return resultMap;
}else{
resultMap.put("message", "头像上传失败,请检查图片!");
resultMap.put("status", 400);
return resultMap;
}
}
前端的UI
开始准备测试
开始编写抛出异常()
主要是出现问题是SQL查询read-only
Cause: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not
https://blog.csdn.net/u011410529/article/details/51496908()
query*的配置成了read-only
最后测试成功(文件上传成功)
查看云端
查看上传的图片
数据库里面储存成功
前面是整合七牛云的
---------------------------------------------------------------------------------------------------------------------------
接下来是整合(阿里云的OSS API)
开始的步骤是一样的
依赖前面已经弄过了
直接查看官方的API的文档,复写自己需要的方法
//阿里流上传
public String Aliupload(InputStream inputStream) {
String endpoint = " XXXXXX ";
String endpoint1 = " XXXXXX ";
// 云账号AccessKey有所有API访问权限,建议遵循阿里云安全最佳实践,创建并使用RAM子账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建。
String accessKeyId = " XXXXXX ";
String accessKeySecret = " XXXXXX ";
String bucketname=" XXXXXX ";
String IMG_UPLOAD_PATH = "";
String name_file = CharacterUtils.getRandomString2(8);//随机数
String key = IMG_UPLOAD_PATH +name_file+"fv_.png";
try {
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
/*InputStream inputStream = new FileInputStream(filePath);*/
ossClient.putObject(bucketname, key, inputStream/*new File(filePath)*/);
inputStream.close();
ossClient.shutdown();
} catch (OSSException oe) {
System.out.println("Caught an upLoad OSSException," + "the error code is " + oe.getErrorCode() + "," + "reason is " + oe.getMessage());
}catch (IOException e) {
System.out.println("File upload problem,throw a IOException");
}
return endpoint1+key;
}
还有流的转换
public class MultFileToIoFile {
private final static Logger LOGGER = LoggerFactory.getLogger(MultFileToIoFile.class);
public static InputStream multipartToInputStream(MultipartFile multipartFile){
CommonsMultipartFile cf = (CommonsMultipartFile) multipartFile;
DiskFileItem diskFileItem = (DiskFileItem) cf.getFileItem();
try{
InputStream inputStream = diskFileItem.getInputStream();
return inputStream;
}catch (IOException e){
e.printStackTrace();
LOGGER.info("文件流传输失败");
}
return null;
}
}
接下来就是control
//文件上传
@RequestMapping(value = "upload",method=RequestMethod.POST)
@ResponseBody
public Map upload(HttpServletRequest request, MultipartFile file)throws Exception {
resultMap.put("status", 400);
if (checkSuffix(file.getOriginalFilename())) {
/*QIniuUpload qIniuUpload = new QIniuUpload();
String head = qIniuUpload.uploadImg2QiNiu(file);
System.out.println(head);*/
AliUpload aliUpload =new AliUpload();
String head = aliUpload.updateFile(file);
System.out.println(head+"1111111111111111111111111111111111111111111");
UUser user = new UUser(head,TokenManager.getToken().getId());
userService.upload(user);
System.out.println("gooood");
resultMap.put("message", "头像上传成功!");
resultMap.put("status", 200);
return resultMap;
}else{
resultMap.put("message", "头像上传失败,请检查图片!");
resultMap.put("status", 400);
return resultMap;
}
}
但是中间出现一个问题
java.lang.NoClassDefFoundError: org/apache/http/ssl/TrustStrategy
org.apache.httpcomponents
httpclient-cache
4.4.1
org.apache.httpcomponents
httpmime
4.4.1
主要是一类httpclient的版本冲突
解决方法:
方法一:删除其他版本的httpclient,如下截图,httpclient版本除了阿里云sdk依赖的没有其他版本。
方法二:添加阿里云sdk排除httpclient依赖:
我把全部的改成httpclient-4.4.1(接下来就可以运行了)
上传文件
查看阿里云的图片情况
数据里面存储的数据信息
今天在项目中整合:图片上传功能,把阿里云和七牛云的功能全部整合到项目中去了,自己也再次熟悉了文件上传和API接口,不同的厂商对应的不同的API的接口的API使用不同
今天遇到的困难:第一个就是七牛的开始文件上传的read-only还有阿里云的httpclient的依赖冲突,最后都完美的解决了
明天的计划:继续完成其他的shiro设计还有更新数据表的实现