30 Commits
Author SHA1 Message Date
hello-hao 86ae47e632 📝 2023-08-01 14:33:16 +08:00
hello-hao 241ab625c0 📝 2023-08-01 14:22:05 +08:00
hello-hao 19c2b3ce9f 📝 2023-08-01 14:19:43 +08:00
hellohao c5b800ad56 更新文档 2023-06-22 19:15:06 +08:00
hellohao c960d2a812 update:优化url上传,修复多个问题 2023-06-22 19:12:53 +08:00
hello-hao 7906948ab7 update:优化调整了多个问题 2023-06-21 19:04:59 +08:00
hello-hao 3fce125334 📝 2023-05-23 10:04:38 +08:00
hello-hao 062823ae53 feat:支持查询图像,自动检测新版本 2023-05-19 18:58:57 +08:00
hello-hao 349845e6f1 📝 2023-05-19 18:50:25 +08:00
hello-hao f40f4177f7 📝 2023-05-19 18:41:58 +08:00
hello-hao 17c49157c2 📝 2023-05-19 18:39:22 +08:00
hello-hao e9d1d2205e 📝 2023-04-19 17:42:04 +08:00
hello-hao 422cfbb724 Merge remote-tracking branch 'origin/master' 2023-04-19 17:40:44 +08:00
hello-hao e65b79ab33 📝 2023-04-19 17:39:53 +08:00
hellohao 4e1bc1fc84 修改创建文件夹方法 2023-04-09 20:45:31 +08:00
hello-hao 96b323e1e9 feat:新增可通过图像名称查询 2023-04-07 17:44:50 +08:00
hello-hao 64bc91247c 📝 2023-04-07 09:39:47 +08:00
hello-hao d2f1d75413 📝 2023-04-07 09:38:10 +08:00
hello-hao be8e51cd47 📝 2023-04-07 09:35:58 +08:00
hello-hao 1d0337f725 update:重构部分上传接口逻辑 2023-04-06 17:44:17 +08:00
hello-hao f8d082e8bf 📝 2023-04-03 13:55:06 +08:00
hello-hao b6c2dee9e5 :art:updata:修正了一些细节问题,去除无用类 2023-03-24 19:01:58 +08:00
hello-hao 603e94bdb1 📝 2023-03-23 17:35:21 +08:00
hello-hao 646a181d03 📝 2023-03-23 17:33:21 +08:00
hellohao c6c5cad4fc 更新文档 2023-03-21 23:50:00 +08:00
hellohao 44b527dabd Revert "更新文档"
This reverts commit dd11dd2589.
2023-03-21 23:49:31 +08:00
hellohao dd11dd2589 更新文档 2023-03-21 23:48:35 +08:00
hello-hao c2b4527c48 :rocket:优化代码 2023-03-21 21:30:09 +08:00
hello-hao 57b6c4ae72 Merge remote-tracking branch 'origin/hellohao-dev'
# Conflicts:
#	src/main/java/cn/hellohao/service/impl/InitializationStorage.java
2023-03-21 21:25:04 +08:00
hello-hao 538482a73b :rocket:删除部分无用代码 2023-03-10 19:45:48 +08:00
26 changed files with 1104 additions and 610 deletions
+107 -72
View File
@@ -7,6 +7,8 @@
![https://img.shields.io/badge/license-AGPL-blue.svg?style=flat-square](https://img.shields.io/badge/license-AGPL-blue.svg?longCache=true&style=flat-square) ![https://img.shields.io/badge/license-AGPL-blue.svg?style=flat-square](https://img.shields.io/badge/license-AGPL-blue.svg?longCache=true&style=flat-square)
![https://img.shields.io/badge/language-java-orange.svg?style=flat-square](https://img.shields.io/badge/language-java-yellow.svg?longCache=true&style=popout-square) ![https://img.shields.io/badge/language-java-orange.svg?style=flat-square](https://img.shields.io/badge/language-java-yellow.svg?longCache=true&style=popout-square)
>:exclamation: 托管的所有开源代码可能存在作者修改/测试/调整等行为,均为实验性代码,故并不保证程序或功能的可用性,如果你想要部署程序,请下载我们提供的编译整合包进行安装部署。
### 引导 ### 引导
@@ -21,46 +23,24 @@
**存储源支持:** **存储源支持:**
开源版:`本地`,`阿里OSS`,`又拍USS`,`七牛KODO`,`腾讯COS`,`网易NOS`,~~`U-File`~~,`FTP` 开源版:`本地`,`阿里OSS`,`又拍USS`,`七牛KODO`,`腾讯COS`,`网易NOS`,`FTP`,`AWS S3协议`(`百度云BOS`,`青云Qingstor`,`Ucloud US3`,`Minio`等兼容S3协议)
Core版`本地`,`阿里OSS`,`又拍USS`,`七牛KODO`,`腾讯COS`,`网易NOS`,~~`U-File`~~,`FTP`,`Backblaze(B2)`,`百度云BOS`,`青云Qingstor`,`Ucloud US3`,`Minio`,`AWS S3`等通用S3协议 [Core版](https://hellohao.cn):开源版的基础上增加`Backblaze(B2)` 并且可`同个对象存储商家`可开多个存储源(可添加至90+存储源)
### 更新日志 `20230101` ### 更新日志 `20230622`
- 优化个人相册,适配右键菜单功能。 - 修复首页批量复制窗点击复制报错
- 修复筛选全部图片时候出现重复的问题。 - 优化画廊分享复制分享信息时网址和提示字符的分割,以防被encode
- 修复上传图片后不记录图片原始名称 - 修复选择筛选框表单内容后,不检索也会筛选的异常情况
- 调整了上传图像的代码逻辑 - 筛选条件添加时间倒序/顺序、文件大小倒序/顺序
- 优化 ftp 上传逻辑 - 优化用户登录账号支持邮箱/用户名方式登录
- 优化多线程上传图像的查重逻辑 - 修复了移动端web页面首页退出按钮无反应问题
- 新增用户协议相关协议内容展示 - 优化默认的站点logo展示逻辑,解决进入页面瞬间显示默认logo的问题
- 提高系统安全性 - 强化图像链接转存功能,支持防盗链地址转存
- 优化多个页面异常问题
[^_^]:程序宣传视频:[自制宣传视频](https://www.bilibili.com/video/BV11r4y1y7mH/)
[^_^]:官网(含Core版)[https://tbed.hellohao.cn](https://tbed.hellohao.cn)
[^_^]:前端源码:[https://github.com/Hello-hao/tbed-web](https://github.com/Hello-hao/tbed-web)
[^_^]:文档地址:[https://doc.hellohao.cn](https://doc.hellohao.cn)
[^_^]:程序展示:[https://tc.hellohao.cn](https://tc.hellohao.cn)
[^_^]:作者博客:[https://www.hellohao.cn](https://www.hellohao.cn)
[^_^]:官网(含Core版)(备用)[http://tbed.wwery.com](http://tbed.wwery.com)
[^_^]:文档地址(备用)[http://doc.wwery.com](http://doc.wwery.com)
[^_^]:程序展示(备用)[http://tc.wwery.com](http://tc.wwery.com)
[^_^]:作者博客(备用)[http://www.wwery.com](http://www.wwery.com)
[^_^]: 程序宣传视频:[自制宣传视频](https://www.bilibili.com/video/BV11r4y1y7mH/)
### 主要功能 ### 主要功能
@@ -105,11 +85,79 @@ Core版:`本地`,`阿里OSS`,`又拍USS`,`七牛KODO`,`腾讯COS`,`网易NOS`,
- [x] 图像直链二维码生成 - [x] 图像直链二维码生成
### 快速开始
**Docker-compose部署:**
1. 创建`docker-compose.yml`文件
> 在服务器的任意目录创建的文件夹中创建`docker-compose.yml`文件,内容如下:
>
> (修改下方前`端域名`,`后端域名`,`数据库密码`等注释的信息,特别要注意文件格式缩进不可以乱改)
```yml
version: "3"
services:
tbed-free:
# 具体版本号需要填写目前发行的最新版本
image: hellohao/tbed-free:2023xxxx
networks:
hellohao_network:
ports:
- "10088:10088"
- "10089:10089"
volumes:
- /HellohaoData/:/HellohaoData/
environment:
MYSQL_URL: jdbc:mysql://hellohaodb/tbed?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
# 自定设置一个MySQL的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致
MYSQL_PASS: tIaNGg@SHa&hIo56
# 前端域名(反代10089端口的域名)
HELLOHAO_WEB_HOST: http://pic.example.com
# 后端域名(反代10088端口的域名)
HELLOHAO_SERVER_HOST: http://server.example.com
hellohaodb:
image: hellohao/mysql-free:1.0
networks:
hellohao_network:
command:
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- --explicit_defaults_for_timestamp=true
ports:
- "3307:3306"
volumes:
- /HellohaoData/mysql:/var/lib/mysql
environment:
# MySQL的密码
MYSQL_ROOT_PASSWORD: tIaNGg@SHa&hIo56
networks:
hellohao_network:
```
2. 启动 Hellohao 服务
```shell
docker-compose up -d
```
更多部署教程参考程序[相关文档](http://doc.hellohao.cn)
### 启动项目
> 访问你的前端域名即可
初始用户名:`admin`
初始邮箱:`admin`
初始密码:`admin`
### 系统预览 ### 系统预览
![首页](https://upload.cc/i1/2022/02/11/t2wCEF.png) ![首页](https://upload.cc/i1/2023/05/23/Lsdivj.png)
![控制台详情](https://upload.cc/i1/2022/02/11/Al8UrH.png) ![控制台详情](https://upload.cc/i1/2022/02/11/Al8UrH.png)
@@ -125,11 +173,26 @@ Core版:`本地`,`阿里OSS`,`又拍USS`,`七牛KODO`,`腾讯COS`,`网易NOS`,
[^_^]: ![多存储源](http://img.wwery.com/Hellohao/xXSMlsTg.png) [^_^]: ![多存储源](http://img.wwery.com/Hellohao/xXSMlsTg.png)
[^_^]: ![站点设置](http://img.wwery.com/Hellohao/n5zXistG.png) [^_^]: ![站点设置](http://img.wwery.com/Hellohao/n5zXistG.png)
### 桌面客户端(win/mac)
> `开源版`/`Core版` 都可以使用
> ![桌面客户端软件](https://upload.cc/i1/2022/07/13/5W8Pxh.png)
### 微信小程序
> 仅适用于对接`Core付费版`,开源版暂不可对接使用。
> 获取地址:[官网获取](https://www.hellohao.cn/pay)
![Hellohao图像托管](https://hellohao.cn/newassets/img/twechat.png)
[//]: # (![Hellohao图像托管](https://upload.cc/i1/2022/03/28/Vnp0bT.png))
### 运行环境 ### 运行环境
- JDK 1.8 - JDK 1.8
- MySQL5.5+ - MySQL5.7+
- Redis - Redis
### 所用技术 ### 所用技术
@@ -150,35 +213,6 @@ Core版:`本地`,`阿里OSS`,`又拍USS`,`七牛KODO`,`腾讯COS`,`网易NOS`,
- JWT认证 - JWT认证
- Shiro - Shiro
### 部署
> 部署方式分为两种:
> 1.一键脚本部署:`Tbed-together.zip`(操作简单)
> 2.自定义部署 前后端分离式部署:`Tbed.zip`(拓展性高适合有一定java前后端分离部署经验的人)
> 需要注意:一键部署的端口为:服务器:`10088` 前端:`10089`
详细部署教程参考程序[相关文档](http://doc.hellohao.cn)
### 启动项目
初始用户名:`admin`
初始邮箱:`admin`
初始密码:`admin`
### 客户端(win64/mac)
> 目前已经正式上线
![桌面客户端软件](https://upload.cc/i1/2022/07/13/5W8Pxh.png)
### 微信小程序
> 目前已有测试版,更多功能开发中,开发进度的快慢要根据作者的工作压力、心情状况等自身情况进行评估。
> 暂时无法给出具体发布小程序的时间。大家期待吧。
![Hellohao图像托管](https://upload.cc/i1/2022/03/28/Vnp0bT.png)
[^_^]: ![小程序UI](https://upload.cc/i1/2022/02/11/6kPmr8.png)
### 声明 ### 声明
本项目遵循[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/#)开源协议,使用前请悉知。 本项目遵循[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/#)开源协议,使用前请悉知。
@@ -188,12 +222,13 @@ Core版:`本地`,`阿里OSS`,`又拍USS`,`七牛KODO`,`腾讯COS`,`网易NOS`,
### 反馈交流 ### 反馈交流
**如果你遇到BUG欢迎反馈** **如果你遇到BUG欢迎反馈**
- 前往论坛发帖反馈、求助:[Hellohao开发者交流论坛](http://bbs.hellohao.cn) - 前往论坛发帖反馈、求助:[Hellohao开发者交流论坛](http://bbs.hellohao.cn)
- 也可加QQ群探讨(目前已满)864800972 - 也可加QQ群探讨:864800972
### 捐赠开发者 ### 更多
**如果你也支持Hellohao图床,可以请我喝杯咖啡。我会持续更新Hellohao图床** **如需程序定制或其他业务,请与我们取得联系**
[Hellohao图像托管官网](http://hellohao.cn)
**捐赠地址:** [**https://tbed.hellohao.cn/pay**](https://tbed.hellohao.cn/pay)
@@ -52,7 +52,6 @@ public static void main(String[] args) {
Stream.of(jpa) Stream.of(jpa)
.map(bf::getBeanDefinition) .map(bf::getBeanDefinition)
.forEach(it -> it.setDependsOn("databaseStartupValidator")); .forEach(it -> it.setDependsOn("databaseStartupValidator"));
}; };
} }
/** /**
@@ -2,6 +2,7 @@ package cn.hellohao.auth.shiro;
import cn.hellohao.pojo.User; import cn.hellohao.pojo.User;
import cn.hellohao.service.UserService; import cn.hellohao.service.UserService;
import cn.hellohao.utils.SetText;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*; import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.AuthorizationInfo;
@@ -46,7 +47,11 @@ public class UserRealm extends AuthorizingRealm {
UsernamePasswordToken userToken = null; UsernamePasswordToken userToken = null;
userToken = (UsernamePasswordToken)tokenOBJ; userToken = (UsernamePasswordToken)tokenOBJ;
User user = new User(); User user = new User();
user.setEmail(userToken.getUsername()); if(SetText.checkEmail(userToken.getUsername())){
user.setEmail(userToken.getUsername());
}else{
user.setUsername(userToken.getUsername());
}
User u = userService.getUsers(user); User u = userService.getUsers(user);
if(u==null){ if(u==null){
return null; return null;
@@ -10,4 +10,7 @@ import java.io.File;
public class GlobalConstant { public class GlobalConstant {
public static String SYSTYPE = "LINUX"; public static String SYSTYPE = "LINUX";
public static String LOCPATH = File.separator + "HellohaoData"; public static String LOCPATH = File.separator + "HellohaoData";
public static final String HELLOHAOTEMPIMG_PATH = File.separator + "HellohaoData"+File.separator+"hellohaotempimg";
} }
@@ -16,6 +16,7 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -312,7 +313,9 @@ public class AdminController {
String starttime = jsonObj.getString("starttime"); String starttime = jsonObj.getString("starttime");
String stoptime = jsonObj.getString("stoptime"); String stoptime = jsonObj.getString("stoptime");
String selectUserType = jsonObj.getString("selectUserType"); // me/all String selectUserType = jsonObj.getString("selectUserType"); // me/all
String order = jsonObj.getString("order");
String username = jsonObj.getString("username"); String username = jsonObj.getString("username");
String searchname = jsonObj.getString("searchname");
Integer selecttype = jsonObj.getInteger("selecttype"); Integer selecttype = jsonObj.getInteger("selecttype");
boolean violation = jsonObj.getBoolean("violation"); boolean violation = jsonObj.getBoolean("violation");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -354,6 +357,10 @@ public class AdminController {
} else { } else {
img.setUserid(user.getId()); img.setUserid(user.getId());
} }
if(!StringUtils.isBlank(searchname)){
img.setSearchname(searchname);
}
img.setOrder(StringUtils.isBlank(order)?"desc":order);
List<Images> images = imgService.selectimg(img); List<Images> images = imgService.selectimg(img);
PageInfo<Images> rolePageInfo = new PageInfo<>(images); PageInfo<Images> rolePageInfo = new PageInfo<>(images);
PageResultBean<Images> pageResultBean = PageResultBean<Images> pageResultBean =
@@ -402,9 +409,15 @@ public class AdminController {
return msg; return msg;
} }
String regex = "^\\w+$"; String regex = "^\\w+$";
if (username.length() > 20 || !username.matches(regex)) { if (username.length() > 30) {
msg.setCode("110403"); msg.setCode("110403");
msg.setInfo("用户名不得超过20位字符"); msg.setInfo("用户名不得超过30位字符");
return msg;
}
if(!username.matches (regex)){
//用户名格式不正确
msg.setCode("110403");
msg.setInfo("用户名不得含有特殊字符");
return msg; return msg;
} }
if (subject.hasRole("admin")) { if (subject.hasRole("admin")) {
@@ -4,7 +4,9 @@ import cn.hellohao.pojo.*;
import cn.hellohao.service.*; import cn.hellohao.service.*;
import cn.hellohao.service.impl.*; import cn.hellohao.service.impl.*;
import cn.hellohao.utils.NewSendEmail; import cn.hellohao.utils.NewSendEmail;
import cn.hellohao.utils.Print;
import cn.hellohao.utils.SetFiles; import cn.hellohao.utils.SetFiles;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@@ -19,6 +21,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List; import java.util.List;
@Controller @Controller
@@ -392,5 +397,50 @@ public class AdminRootController {
return msg; return msg;
} }
@PostMapping("/sysVersion")
@ResponseBody
public Msg sysupdate(@RequestParam(value = "data", defaultValue = "") String data) {
final Msg msg = new Msg();
JSONObject jsonObj = JSONObject.parseObject(data);
String dates = jsonObj.getString("dates");
HashMap<String, Object> paramMap = new HashMap<>();
String urls = "http://check.hellohao.cn:8090/getNoticeText";
JSONObject jsonObject =null;
try {
URL u = new URL(urls);
HttpURLConnection uConnection = (HttpURLConnection) u.openConnection();
uConnection.connect();
if(uConnection.getResponseCode()==200){
jsonObject =JSONObject.parseObject(HttpUtil.get(urls));
String openv = jsonObject.getString("openv");
String opentext = jsonObject.getString("opentext");
JSONObject versionJson = new JSONObject();
if(Double.valueOf(openv)>Double.valueOf(dates)){
versionJson.put("code","110200");
versionJson.put("newVersion",openv);
versionJson.put("versionMsg",opentext);
msg.setCode("110200");
msg.setData(versionJson);
}else{
versionJson.put("code","110300");
versionJson.put("newVersion",openv);
versionJson.put("versionMsg","当前已是最新版本");
msg.setCode("110300");
msg.setData(versionJson);
}
}else{
msg.setCode("110500");
msg.setData("未获取到更新状态");
}
uConnection.disconnect();
} catch (Exception e) {
e.printStackTrace();
Print.warning("connect failed");
msg.setCode("110500");
msg.setData("未获取到更新状态");
}
return msg;
}
} }
@@ -10,13 +10,16 @@ import cn.hellohao.service.UploadConfigService;
import cn.hellohao.service.impl.UploadServicel; import cn.hellohao.service.impl.UploadServicel;
import cn.hellohao.service.impl.UserServiceImpl; import cn.hellohao.service.impl.UserServiceImpl;
import cn.hellohao.utils.Base64ToMultipartFile; import cn.hellohao.utils.Base64ToMultipartFile;
import cn.hellohao.utils.SetFiles;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.File;
/** /**
* @author Hellohao * @author Hellohao
@@ -86,12 +89,17 @@ public class ClientAppController {
} }
@PostMapping("/imgUpload") @PostMapping("/imgUpload")
public Msg imgUpload(HttpServletRequest request, @RequestParam(required = true, value = "file") MultipartFile file, public Msg imgUpload(HttpServletRequest request, @RequestParam(required = true, value = "file") MultipartFile multipartFile,
@RequestParam(required = true, value = "days") String days) { @RequestParam(required = true, value = "days") String days) {
Msg msg = new Msg(); Msg msg = new Msg();
try{ try{
if (null != file) { if (null != multipartFile) {
msg = uploadServicel.uploadForLoc(request,file,Integer.valueOf(days),null); String originalFilename = multipartFile.getOriginalFilename();
if(StringUtils.isBlank(originalFilename)){
originalFilename = "未命名图像";
}
File file = SetFiles.changeFile_new(multipartFile);
msg = uploadServicel.uploadForLoc(request,file,originalFilename,Integer.valueOf(days),null,null);
}else{ }else{
msg.setCode("500"); msg.setCode("500");
} }
@@ -109,9 +117,11 @@ public class ClientAppController {
JSONObject jsonObj = JSONObject.parseObject(data); JSONObject jsonObj = JSONObject.parseObject(data);
String imgstr = jsonObj.getString("imgstr"); String imgstr = jsonObj.getString("imgstr");
Integer days = jsonObj.getInteger("days"); Integer days = jsonObj.getInteger("days");
String md5 = jsonObj.getString("md5");
if (null != imgstr && !imgstr.isEmpty()) { if (null != imgstr && !imgstr.isEmpty()) {
MultipartFile multipartFile = Base64ToMultipartFile.base64Convert(imgstr); MultipartFile multipartFile = Base64ToMultipartFile.base64Convert(imgstr);
msg = uploadServicel.uploadForLoc(request, multipartFile, days, null); File file = SetFiles.changeFile_new(multipartFile);
msg = uploadServicel.uploadForLoc(request, file,"未命名图像", days, null,md5);
} }
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); e.printStackTrace();
@@ -1,12 +1,14 @@
package cn.hellohao.controller; package cn.hellohao.controller;
import cn.hellohao.auth.token.JWTUtil; import cn.hellohao.auth.token.JWTUtil;
import cn.hellohao.config.GlobalConstant;
import cn.hellohao.pojo.*; import cn.hellohao.pojo.*;
import cn.hellohao.service.*; import cn.hellohao.service.*;
import cn.hellohao.service.impl.UploadServicel; import cn.hellohao.service.impl.UploadServicel;
import cn.hellohao.service.impl.deleImages; import cn.hellohao.service.impl.deleImages;
import cn.hellohao.utils.GetIPS; import cn.hellohao.utils.GetIPS;
import cn.hellohao.utils.MyVersion; import cn.hellohao.utils.MyVersion;
import cn.hellohao.utils.SetFiles;
import cn.hutool.captcha.CaptchaUtil; import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha; import cn.hutool.captcha.ShearCaptcha;
import cn.hutool.captcha.generator.MathGenerator; import cn.hutool.captcha.generator.MathGenerator;
@@ -19,15 +21,17 @@ import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
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 org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CompletableFuture;
@Controller @Controller
public class IndexController { public class IndexController {
@@ -43,7 +47,7 @@ public class IndexController {
@RequestMapping(value = "/") @RequestMapping(value = "/")
public String Welcome(Model model, HttpServletRequest httpServletRequest) { public String Welcome(Model model, HttpServletRequest httpServletRequest) {
model.addAttribute("name", "服务端程序(开源版)"); model.addAttribute("name", "服务端程序(开源版)");
model.addAttribute("version", "20230320"); model.addAttribute("version", "20230622");
model.addAttribute("ip", GetIPS.getIpAddr(httpServletRequest)); model.addAttribute("ip", GetIPS.getIpAddr(httpServletRequest));
model.addAttribute("links", "https://github.com/Hello-hao/tbed"); model.addAttribute("links", "https://github.com/Hello-hao/tbed");
return "welcome"; return "welcome";
@@ -62,7 +66,7 @@ public class IndexController {
jsonObject.put("webname", cd.getString("webname")); jsonObject.put("webname", cd.getString("webname"));
jsonObject.put("websubtitle", cd.getString("websubtitle")); jsonObject.put("websubtitle", cd.getString("websubtitle"));
jsonObject.put("keywords", cd.getString("keywords")); jsonObject.put("keywords", cd.getString("keywords"));
jsonObject.put("description", cd.getString("description")); jsonObject.put("webms", cd.getString("webms"));
jsonObject.put("explain", cd.getString("explain")); jsonObject.put("explain", cd.getString("explain"));
jsonObject.put("baidu", cd.getString("baidu")); jsonObject.put("baidu", cd.getString("baidu"));
jsonObject.put("links", cd.getString("links")); jsonObject.put("links", cd.getString("links"));
@@ -78,14 +82,61 @@ public class IndexController {
msg.setData(jsonObject); msg.setData(jsonObject);
return msg; return msg;
} }
@PostMapping("/uploadChunkFile")
@ResponseBody
@CrossOrigin
public Msg uploadChunk(HttpServletRequest request,Chunk chunk) {
Msg msg = new Msg();
MultipartFile file = chunk.getFile();
try {
byte[] bytes = file.getBytes();
Path path = Paths.get(SetFiles.generatePath(GlobalConstant.HELLOHAOTEMPIMG_PATH+ File.separator+chunk.getUuid(), chunk));
java.nio.file.Files.write(path, bytes);
JSONObject jsonObject = new JSONObject();
jsonObject.put("chunkNumber",chunk.getChunkNumber());
jsonObject.put("totalChunks",chunk.getTotalChunks());
msg.setData(jsonObject);
msg.setCode("200");
return msg;
} catch (IOException e) {
e.printStackTrace();
msg.setCode("500");
return msg;
}
}
@PostMapping("/processFile")
@ResponseBody
@CrossOrigin
public Msg processFile(HttpServletRequest request,@RequestParam(value = "data", defaultValue = "") String data){
Msg msg = new Msg();
try{
Subject subject = SecurityUtils.getSubject();
User user = (User) subject.getPrincipal();
CompletableFuture<Msg> ret = uploadServicel.mergeFile(request,data,user);
msg = ret.get();
}catch (Exception e){
msg.setCode("500");
msg.setInfo("处理文件错误,上传失败");
}
return msg;
}
@PostMapping(value = {"/upload", "/client/upload"}) @PostMapping(value = {"/upload", "/client/upload"})
@ResponseBody @ResponseBody
public Msg upimg( public Msg upimg(
HttpServletRequest request, HttpServletRequest request,
@RequestParam(value = "file", required = false) MultipartFile multipartFile, @RequestParam(value = "file", required = false) MultipartFile multipartFile,
Integer day) { Integer day,@RequestParam(value = "md5",required = false) String md5) {
return uploadServicel.uploadForLoc(request, multipartFile, day, null); JSONArray jsonArray = new JSONArray();
Subject subject = SecurityUtils.getSubject();
User user = (User) subject.getPrincipal();
String originalFilename = multipartFile.getOriginalFilename();
if(StringUtils.isBlank(originalFilename)){
originalFilename = "未命名图像";
}
File file = SetFiles.changeFile_new(multipartFile);
return uploadServicel.uploadForLoc(request, file,originalFilename, day, null,md5);
} }
@PostMapping(value = {"/uploadForUrl", "/client/uploadForUrl"}) @PostMapping(value = {"/uploadForUrl", "/client/uploadForUrl"})
@@ -95,6 +146,7 @@ public class IndexController {
JSONObject jsonObj = JSONObject.parseObject(data); JSONObject jsonObj = JSONObject.parseObject(data);
Integer setday = jsonObj.getInteger("day"); Integer setday = jsonObj.getInteger("day");
String imgUrl = jsonObj.getString("imgUrl"); String imgUrl = jsonObj.getString("imgUrl");
String referer = jsonObj.getString("referer");
String[] URLArr = imgUrl.split("\n"); String[] URLArr = imgUrl.split("\n");
Subject subject = SecurityUtils.getSubject(); Subject subject = SecurityUtils.getSubject();
@@ -114,7 +166,10 @@ public class IndexController {
for (int i = 0; i < URLArr.length; i++) { for (int i = 0; i < URLArr.length; i++) {
int temp = i + 1; int temp = i + 1;
if (syscounts >= temp) { if (syscounts >= temp) {
Msg msg = uploadServicel.uploadForLoc(request, null, setday, URLArr[i]); JSONObject imgJson = new JSONObject();
imgJson.put("imgUrl",URLArr[i]);
imgJson.put("referer",referer);
Msg msg = uploadServicel.uploadForLoc(request, null,"URL转存图像", setday, imgJson,null);
if (!msg.getCode().equals("200")) { if (!msg.getCode().equals("200")) {
errcounts++; errcounts++;
} else { } else {
@@ -62,10 +62,16 @@ public class UserController {
return msg; return msg;
} }
String regex = "^\\w+$"; String regex = "^\\w+$";
if(username.length()>20 || !username.matches (regex)){ if(username.length()>30){
//用户名格式不正确 //用户名格式不正确
msg.setCode("110403"); msg.setCode("110403");
msg.setInfo("用户名不得超过20位字符"); msg.setInfo("用户名不得超过30位字符");
return msg;
}
if(!username.matches (regex)){
//用户名格式不正确
msg.setCode("110403");
msg.setInfo("用户名不得含有特殊字符");
return msg; return msg;
} }
if(null==redis_verifyCodeForRegister){ if(null==redis_verifyCodeForRegister){
@@ -198,15 +204,15 @@ public class UserController {
} catch (UnknownAccountException e) { } catch (UnknownAccountException e) {
//此异常说明用户名不存在 //此异常说明用户名不存在
msg.setCode("4000"); msg.setCode("4000");
msg.setInfo("登录邮箱不存在"); msg.setInfo("登录账号不存在");
System.err.println("邮箱不存在"); System.err.println("邮箱/用户名不存在");
e.printStackTrace(); // e.printStackTrace();
return msg; return msg;
}catch (IncorrectCredentialsException e) { }catch (IncorrectCredentialsException e) {
msg.setCode("4000"); msg.setCode("4000");
msg.setInfo("登录密码错误"); msg.setInfo("登录密码错误");
System.err.println("密码不存在"); System.err.println("密码不存在");
e.printStackTrace(); // e.printStackTrace();
return msg; return msg;
}catch (Exception e) { }catch (Exception e) {
msg.setCode("5000"); msg.setCode("5000");
+1 -1
View File
@@ -37,7 +37,7 @@ public interface ImgMapper {
Integer md5Count(Images images); Integer md5Count(Images images);
List<Images> selectImgUrlByMD5(@Param("md5key") String md5key); List<Images> selectImgUrlByMD5(Images images);
List<Images> RecentlyUploaded(@Param("userid") Integer userid); List<Images> RecentlyUploaded(@Param("userid") Integer userid);
+70
View File
@@ -0,0 +1,70 @@
package cn.hellohao.pojo;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Transient;
import org.springframework.web.multipart.MultipartFile;
import java.io.Serializable;
@Data
public class Chunk implements Serializable {
@Id
private String uid;
/**
* 当前文件块,从1开始
*/
private Integer chunkNumber;
/**
* 分块大小
*/
private Long chunkSize;
/**
* 当前分块大小
*/
private Long currentChunkSize;
/**
* 总大小
*/
private Long totalSize;
/**
* 文件标识
*/
private String identifier;
/**
* 文件名
*/
private String filename;
/**
* 相对路径
*/
private String relativePath;
/**
* 总块数
*/
private Integer totalChunks;
/**
* 文件类型
*/
private String type;
/**
* 前台创建的随机UID,用作创建合并文件的唯一标识目录名
*/
private String uuid;
/**
* 归类
*/
private String classifications;
/**
* 天数
*/
private Integer day;
@Transient
private MultipartFile file;
}
@@ -1,30 +0,0 @@
package cn.hellohao.pojo;
import lombok.Data;
@Data
public class Config {
private Integer id;
private Integer sourcekey;
private Integer emails;
private String webname;
private String explain;
private String video;
private Integer backtype;
private String links;
private String notice;
private String baidu;
private String domain;
private String background1;
private String background2;
private String sett;
private String webms;
private String webkeywords;
private String webfavicons;
private Integer theme;
private String websubtitle;
private String logo;
private String aboutinfo;
}
+325 -312
View File
@@ -1,5 +1,8 @@
package cn.hellohao.pojo; package cn.hellohao.pojo;
import lombok.Data;
@Data
public class Images { public class Images {
// 默认的时间字符串格式 // 默认的时间字符串格式
@@ -37,318 +40,328 @@ public class Images {
private String classificationuid; //类别uid集合 private String classificationuid; //类别uid集合
private String idname; private String idname;
private Integer isRepeat;//如果没有开启查重的时候他是0,开启为1 private Integer isRepeat;//如果没有开启查重的时候他是0,开启为1
private String searchname;
public Images() { private String order;
super(); //
} // public Images() {
// super();
public Images(String imgurl, String sizes, String abnormal, String updatetime, String username, String md5key, String imguid) { // }
this.imgurl = imgurl; //
this.sizes = sizes; // public Images(String imgurl, String sizes, String abnormal, String updatetime, String username, String md5key, String imguid) {
this.abnormal = abnormal; // this.imgurl = imgurl;
this.updatetime = updatetime; // this.sizes = sizes;
this.username = username; // this.abnormal = abnormal;
this.md5key = md5key; // this.updatetime = updatetime;
this.imguid = imguid; // this.username = username;
} // this.md5key = md5key;
// this.imguid = imguid;
public Images(Long id, String imgname, String imgurl, Integer userid, String sizes, String abnormal, Integer source, // }
Integer imgtype, String updatetime, String username, Integer storageType, String starttime, String stoptime, //
String explains, String md5key, String notes, String useridlist, String imguid, String albumtitle, // public Images(Long id, String imgname, String imgurl, Integer userid, String sizes, String abnormal, Integer source,
String password, Integer selecttype,Long countNum,Integer monthNum,String yyyy, // Integer imgtype, String updatetime, String username, Integer storageType, String starttime, String stoptime,
String format,String about,Integer great,String[] classifuidlist,String classificationuid,String violation, // String explains, String md5key, String notes, String useridlist, String imguid, String albumtitle,
String idname,Integer isRepeat) { // String password, Integer selecttype,Long countNum,Integer monthNum,String yyyy,
this.id = id; // String format,String about,Integer great,String[] classifuidlist,String classificationuid,String violation,
this.imgname = imgname; // String idname,Integer isRepeat,String searchname) {
this.imgurl = imgurl; // this.id = id;
this.userid = userid; // this.imgname = imgname;
this.sizes = sizes; // this.imgurl = imgurl;
this.abnormal = abnormal; // this.userid = userid;
this.source = source; // this.sizes = sizes;
this.imgtype = imgtype; // this.abnormal = abnormal;
this.updatetime = updatetime; // this.source = source;
this.username = username; // this.imgtype = imgtype;
this.storageType = storageType; // this.updatetime = updatetime;
this.starttime = starttime; // this.username = username;
this.stoptime = stoptime; // this.storageType = storageType;
this.explains = explains; // this.starttime = starttime;
this.md5key = md5key; // this.stoptime = stoptime;
this.notes = notes; // this.explains = explains;
this.useridlist = useridlist; // this.md5key = md5key;
this.imguid = imguid; // this.notes = notes;
this.albumtitle = albumtitle; // this.useridlist = useridlist;
this.password = password; // this.imguid = imguid;
this.selecttype = selecttype; // this.albumtitle = albumtitle;
this.countNum = countNum; // this.password = password;
this.monthNum = monthNum; // this.selecttype = selecttype;
this.yyyy = yyyy; // this.countNum = countNum;
this.format = format; // this.monthNum = monthNum;
this.about = about; // this.yyyy = yyyy;
this.great = great; // this.format = format;
this.classifuidlist = classifuidlist; // this.about = about;
this.classificationuid = classificationuid; // this.great = great;
this.violation = violation; // this.classifuidlist = classifuidlist;
this.idname = idname; // this.classificationuid = classificationuid;
this.isRepeat = isRepeat; // this.violation = violation;
// this.idname = idname;
} // this.isRepeat = isRepeat;
// this.searchname = searchname;
public Long getId() { // }
return id; //
} // public Long getId() {
// return id;
public void setId(Long id) { // }
this.id = id; //
} // public void setId(Long id) {
// this.id = id;
public String getImgname() { // }
return imgname; //
} // public String getImgname() {
// return imgname;
public void setImgname(String imgname) { // }
this.imgname = imgname; //
} // public void setImgname(String imgname) {
// this.imgname = imgname;
public String getImgurl() { // }
return imgurl; //
} // public String getImgurl() {
// return imgurl;
public void setImgurl(String imgurl) { // }
this.imgurl = imgurl; //
} // public void setImgurl(String imgurl) {
// this.imgurl = imgurl;
public Integer getUserid() { // }
return userid; //
} // public Integer getUserid() {
// return userid;
public void setUserid(Integer userid) { // }
this.userid = userid; //
} // public void setUserid(Integer userid) {
// this.userid = userid;
public String getSizes() { // }
return sizes; //
} // public String getSizes() {
// return sizes;
public void setSizes(String sizes) { // }
this.sizes = sizes; //
} // public void setSizes(String sizes) {
// this.sizes = sizes;
public String getAbnormal() { // }
return abnormal; //
} // public String getAbnormal() {
// return abnormal;
public void setAbnormal(String abnormal) { // }
this.abnormal = abnormal; //
} // public void setAbnormal(String abnormal) {
// this.abnormal = abnormal;
public Integer getSource() { // }
return source; //
} // public Integer getSource() {
// return source;
public void setSource(Integer source) { // }
this.source = source; //
} // public void setSource(Integer source) {
// this.source = source;
public Integer getImgtype() { // }
return imgtype; //
} // public Integer getImgtype() {
// return imgtype;
public void setImgtype(Integer imgtype) { // }
this.imgtype = imgtype; //
} // public void setImgtype(Integer imgtype) {
// this.imgtype = imgtype;
public String getUpdatetime() { // }
return updatetime; //
} // public String getUpdatetime() {
// return updatetime;
public void setUpdatetime(String updatetime) { // }
this.updatetime = updatetime; //
} // public void setUpdatetime(String updatetime) {
// this.updatetime = updatetime;
public String getUsername() { // }
return username; //
} // public String getUsername() {
// return username;
public void setUsername(String username) { // }
this.username = username; //
} // public void setUsername(String username) {
// this.username = username;
public Integer getStorageType() { // }
return storageType; //
} // public Integer getStorageType() {
// return storageType;
public void setStorageType(Integer storageType) { // }
this.storageType = storageType; //
} // public void setStorageType(Integer storageType) {
// this.storageType = storageType;
public String getStarttime() { // }
return starttime; //
} // public String getStarttime() {
// return starttime;
public void setStarttime(String starttime) { // }
this.starttime = starttime; //
} // public void setStarttime(String starttime) {
// this.starttime = starttime;
public String getStoptime() { // }
return stoptime; //
} // public String getStoptime() {
// return stoptime;
public void setStoptime(String stoptime) { // }
this.stoptime = stoptime; //
} // public void setStoptime(String stoptime) {
// this.stoptime = stoptime;
public String getExplains() { // }
return explains; //
} // public String getExplains() {
// return explains;
public void setExplains(String explains) { // }
this.explains = explains; //
} // public void setExplains(String explains) {
// this.explains = explains;
public String getMd5key() { // }
return md5key; //
} // public String getMd5key() {
// return md5key;
public void setMd5key(String md5key) { // }
this.md5key = md5key; //
} // public void setMd5key(String md5key) {
// this.md5key = md5key;
public String getNotes() { // }
return notes; //
} // public String getNotes() {
// return notes;
public void setNotes(String notes) { // }
this.notes = notes; //
} // public void setNotes(String notes) {
// this.notes = notes;
public String getUseridlist() { // }
return useridlist; //
} // public String getUseridlist() {
// return useridlist;
public void setUseridlist(String useridlist) { // }
this.useridlist = useridlist; //
} // public void setUseridlist(String useridlist) {
// this.useridlist = useridlist;
public String getImguid() { // }
return imguid; //
} // public String getImguid() {
// return imguid;
public void setImguid(String imguid) { // }
this.imguid = imguid; //
} // public void setImguid(String imguid) {
// this.imguid = imguid;
// }
public String getAlbumtitle() { //
return albumtitle; //
} // public String getAlbumtitle() {
// return albumtitle;
public void setAlbumtitle(String albumtitle) { // }
this.albumtitle = albumtitle; //
} // public void setAlbumtitle(String albumtitle) {
// this.albumtitle = albumtitle;
public String getPassword() { // }
return password; //
} // public String getPassword() {
// return password;
public void setPassword(String password) { // }
this.password = password; //
} // public void setPassword(String password) {
// this.password = password;
public Integer getSelecttype() { // }
return selecttype; //
} // public Integer getSelecttype() {
// return selecttype;
public void setSelecttype(Integer selecttype) { // }
this.selecttype = selecttype; //
} // public void setSelecttype(Integer selecttype) {
// this.selecttype = selecttype;
public Long getCountNum() { // }
return countNum; //
} // public Long getCountNum() {
// return countNum;
public void setCountNum(Long countNum) { // }
this.countNum = countNum; //
} // public void setCountNum(Long countNum) {
// this.countNum = countNum;
public Integer getMonthNum() { // }
return monthNum; //
} // public Integer getMonthNum() {
// return monthNum;
public void setMonthNum(Integer monthNum) { // }
this.monthNum = monthNum; //
} // public void setMonthNum(Integer monthNum) {
// this.monthNum = monthNum;
public String getYyyy() { // }
return yyyy; //
} // public String getYyyy() {
// return yyyy;
public void setYyyy(String yyyy) { // }
this.yyyy = yyyy; //
} // public void setYyyy(String yyyy) {
// this.yyyy = yyyy;
public String getFormat() { // }
return format; //
} // public String getFormat() {
// return format;
public void setFormat(String format) { // }
this.format = format; //
} // public void setFormat(String format) {
// this.format = format;
public String getAbout() { // }
return about; //
} // public String getAbout() {
// return about;
public void setAbout(String about) { // }
this.about = about; //
} // public void setAbout(String about) {
// this.about = about;
public Integer getGreat() { // }
return great; //
} // public Integer getGreat() {
// return great;
public void setGreat(Integer great) { // }
this.great = great; //
} // public void setGreat(Integer great) {
// this.great = great;
public String[] getClassifuidlist() { // }
return classifuidlist; //
} // public String[] getClassifuidlist() {
// return classifuidlist;
public void setClassifuidlist(String[] classifuidlist ) { // }
this.classifuidlist = classifuidlist; //
} // public void setClassifuidlist(String[] classifuidlist ) {
// this.classifuidlist = classifuidlist;
public String getClassificationuid() { // }
return classificationuid; //
} // public String getClassificationuid() {
// return classificationuid;
public void setClassificationuid(String classificationuid) { // }
this.classificationuid = classificationuid; //
} // public void setClassificationuid(String classificationuid) {
// this.classificationuid = classificationuid;
public String getViolation() { // }
return violation; //
} // public String getViolation() {
// return violation;
public void setViolation(String violation) { // }
this.violation = violation; //
} // public void setViolation(String violation) {
// this.violation = violation;
public String getIdname() { // }
return idname; //
} // public String getIdname() {
// return idname;
public void setIdname(String idname) { // }
this.idname = idname; //
} // public void setIdname(String idname) {
// this.idname = idname;
public Integer getIsRepeat() { // }
return isRepeat; //
} // public Integer getIsRepeat() {
// return isRepeat;
public void setIsRepeat(Integer isRepeat) { // }
this.isRepeat = isRepeat; //
} // public void setIsRepeat(Integer isRepeat) {
// this.isRepeat = isRepeat;
// }
//
// public String getSearchname() {
// return searchname;
// }
//
// public void setSearchname(String searchname) {
// this.searchname = searchname;
// }
} }
@@ -37,7 +37,7 @@ public interface ImgService {
Integer md5Count(Images images); Integer md5Count(Images images);
List<Images> selectImgUrlByMD5(String md5key); List<Images> selectImgUrlByMD5(Images images);
List<Images> RecentlyUploaded(Integer userid); List<Images> RecentlyUploaded(Integer userid);
@@ -2,10 +2,14 @@ package cn.hellohao.service.impl;
import cn.hellohao.dao.*; import cn.hellohao.dao.*;
import cn.hellohao.pojo.*; import cn.hellohao.pojo.*;
import cn.hellohao.service.ConfdataService;
import cn.hellohao.service.ImgTempService; import cn.hellohao.service.ImgTempService;
import cn.hellohao.service.SysConfigService;
import cn.hellohao.utils.*; import cn.hellohao.utils.*;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -23,12 +27,15 @@ import java.util.*;
*/ */
@Service @Service
public class ClientService { public class ClientService {
private static Logger logger = LoggerFactory.getLogger(ClientService.class);
@Autowired
ConfdataService confdataService;
@Autowired
SysConfigService sysConfigService;
@Autowired private UserMapper userMapper; @Autowired private UserMapper userMapper;
@Autowired private KeysMapper keysMapper; @Autowired private KeysMapper keysMapper;
@Autowired private UploadConfigMapper uploadConfigMapper; @Autowired private UploadConfigMapper uploadConfigMapper;
@Autowired private ImgMapper imgMapper; @Autowired private ImgServiceImpl imgServiceImpl;
@Autowired private ImgreviewMapper imgreviewMapper;
@Autowired private ImgTempService imgTempService; @Autowired private ImgTempService imgTempService;
@Autowired private GetSource getSource; @Autowired private GetSource getSource;
@Autowired private ImgViolationJudgeServiceImpl imgViolationJudgeService; @Autowired private ImgViolationJudgeServiceImpl imgViolationJudgeService;
@@ -37,10 +44,11 @@ public class ClientService {
HttpServletRequest request, MultipartFile multipartFile, String email, String pass,Integer setday) { HttpServletRequest request, MultipartFile multipartFile, String email, String pass,Integer setday) {
Msg msg = new Msg(); Msg msg = new Msg();
try { try {
Confdata dataJson = confdataService.selectConfdata("config");
JSONObject confdata = JSONObject.parseObject(dataJson.getJsondata());
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String imageFileName = "未命名图像"; String imageFileName = "未命名图像";
Integer sourceKeyId = 0; Integer sourceKeyId = 0;
FileInputStream fis = null;
String md5key = null; String md5key = null;
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
String userip = GetIPS.getIpAddr(request); String userip = GetIPS.getIpAddr(request);
@@ -86,12 +94,20 @@ public class ClientService {
msg.setInfo("图像超出系统限制大小"); msg.setInfo("图像超出系统限制大小");
return msg; return msg;
} }
FileInputStream fis = null;
try { try {
fis = new FileInputStream(file); fis = new FileInputStream(file);
md5key = DigestUtils.md5Hex(fis); md5key = DigestUtils.md5Hex(fis);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
System.out.println("未获取到图片的MD5,成成UUID"); System.out.println("未获取到图片的MD5,成成UUID");
}finally{
try {
if (null != fis)
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
} }
Msg fileMiME = TypeDict.FileMiME(file); Msg fileMiME = TypeDict.FileMiME(file);
if (!fileMiME.getCode().equals("200")) { if (!fileMiME.getCode().equals("200")) {
@@ -152,35 +168,21 @@ public class ClientService {
imgObj.setImguid(imguid); imgObj.setImguid(imguid);
imgObj.setFormat(fileMiME.getData().toString()); imgObj.setFormat(fileMiME.getData().toString());
imgObj.setIdname(imageFileName); imgObj.setIdname(imageFileName);
Integer insertRet = imgMapper.insertImgData(imgObj); Msg insertRet = imgServiceImpl.insertImgDataForCheck(imgObj,u,confdata,file.getName());
if (insertRet == 0) { if (insertRet.getCode().equals("000")) {
Images imaOBJ = new Images(); return insertRet;
imaOBJ.setMd5key(md5key);
imaOBJ.setUserid(u == null ? 0 : u.getId());
List<Images> images = imgMapper.selectImgUrlByMD5(md5key);
if (images.size() > 0) {
jsonObject.put("url", images.get(0).getImgurl());
jsonObject.put("name", file.getName());
jsonObject.put("size", images.get(0).getSizes());
msg.setData(jsonObject);
return msg;
} else {
msg.setInfo("未获取到指定图像");
msg.setCode("110501");
return msg;
}
} }
long stime = System.currentTimeMillis(); long stime = System.currentTimeMillis();
ReturnImage returnImage = getSource.storageSource(key.getStorageType(), map, updatePath, key.getId()); ReturnImage returnImage = getSource.storageSource(key.getStorageType(), map, updatePath, key.getId());
if (returnImage.getCode().equals("200")) { if (returnImage.getCode().equals("200")) {
long etime = System.currentTimeMillis(); long etime = System.currentTimeMillis();
Print.Normal("上传图片所用总时长:" + String.valueOf(etime - stime) + "ms"); logger.info("上传图片所用总时长:" + String.valueOf(etime - stime) + "ms");
jsonObject.put("url", imgObj.getImgurl()); jsonObject.put("url", imgObj.getImgurl());
jsonObject.put("name", imgObj.getImgname()); jsonObject.put("name", imgObj.getImgname());
jsonObject.put("size", imgObj.getSizes()); jsonObject.put("size", imgObj.getSizes());
imgViolationJudgeService.LegalImageCheck(imgObj,key); imgViolationJudgeService.LegalImageCheck(imgObj,key);
} else { } else {
imgMapper.deleimgForImgUid(imgObj.getImguid()); imgServiceImpl.deleimgForImgUid(imgObj.getImguid());
msg.setCode("5001"); msg.setCode("5001");
msg.setInfo("上传服务内部错误"); msg.setInfo("上传服务内部错误");
return msg; return msg;
@@ -217,9 +219,9 @@ public class ClientService {
memory = Long.valueOf(uploadConfig.getVisitormemory()); // 单位 B 游客设置总量 memory = Long.valueOf(uploadConfig.getVisitormemory()); // 单位 B 游客设置总量
TotleMemory = Long.valueOf(uploadConfig.getFilesizetourists()); // 单位 B 游客单文件大小 TotleMemory = Long.valueOf(uploadConfig.getFilesizetourists()); // 单位 B 游客单文件大小
UsedTotleMemory = UsedTotleMemory =
imgMapper.getusermemory(0) == null imgServiceImpl.getusermemory(0) == null
? 0L ? 0L
: imgMapper.getusermemory(0); // 单位 B : imgServiceImpl.getusermemory(0); // 单位 B
} else { } else {
// 判断用户能不能上传 // 判断用户能不能上传
if (uploadConfig.getUserclose() != 1) { if (uploadConfig.getUserclose() != 1) {
@@ -232,9 +234,9 @@ public class ClientService {
memory = Long.valueOf(user.getMemory()); // 单位 B memory = Long.valueOf(user.getMemory()); // 单位 B
TotleMemory = Long.valueOf(uploadConfig.getFilesizeuser()); // 单位 B TotleMemory = Long.valueOf(uploadConfig.getFilesizeuser()); // 单位 B
UsedTotleMemory = UsedTotleMemory =
imgMapper.getusermemory(user.getId()) == null imgServiceImpl.getusermemory(user.getId()) == null
? 0L ? 0L
: imgMapper.getusermemory(user.getId()); // 单位 B : imgServiceImpl.getusermemory(user.getId()); // 单位 B
} }
// 判断上传的图片目录结构类型 // 判断上传的图片目录结构类型
if (uploadConfig.getUrltype() == 2) { if (uploadConfig.getUrltype() == 2) {
@@ -1,11 +1,16 @@
package cn.hellohao.service.impl; package cn.hellohao.service.impl;
import cn.hellohao.dao.ImgMapper; import cn.hellohao.dao.ImgMapper;
import cn.hellohao.dao.SysConfigMapper;
import cn.hellohao.pojo.Images; import cn.hellohao.pojo.Images;
import cn.hellohao.pojo.Msg;
import cn.hellohao.pojo.SysConfig;
import cn.hellohao.pojo.User; import cn.hellohao.pojo.User;
import cn.hellohao.service.ImgService; import cn.hellohao.service.ImgService;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@@ -13,7 +18,8 @@ import java.util.List;
public class ImgServiceImpl implements ImgService { public class ImgServiceImpl implements ImgService {
@Autowired @Autowired
private ImgMapper imgMapper; private ImgMapper imgMapper;
@Autowired
SysConfigMapper sysConfigMapper;
@Override @Override
public List<Images> selectimg(Images images) { public List<Images> selectimg(Images images) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
@@ -88,8 +94,8 @@ public class ImgServiceImpl implements ImgService {
} }
@Override @Override
public List<Images> selectImgUrlByMD5(String md5key) { public List<Images> selectImgUrlByMD5(Images images) {
return imgMapper.selectImgUrlByMD5(md5key); return imgMapper.selectImgUrlByMD5(images);
} }
@Override @Override
@@ -117,4 +123,38 @@ public class ImgServiceImpl implements ImgService {
return imgMapper.selectImgUrlByImgUID(imguid); return imgMapper.selectImgUrlByImgUID(imguid);
} }
@Transactional
public Msg insertImgDataForCheck(Images images, User user, JSONObject confdata, String flilename)throws Exception {
Msg msg = new Msg();
JSONObject jsonObject = new JSONObject();
SysConfig sysConfig = sysConfigMapper.getstate();
if(sysConfig.getCheckduplicate().equals("1")){
//查重
Images img = new Images();
img.setUserid(user.getId());
img.setMd5key(images.getMd5key());
List<Images> list = imgMapper.selectImgUrlByMD5(img);
jsonObject.put("url", list.get(0).getImgurl());
if (list.size() > 0) {
jsonObject.put("url", list.get(0).getImgurl());
jsonObject.put("name", flilename);
jsonObject.put("imguid", list.get(0).getImguid());
System.err.println(jsonObject.toJSONString());
msg.setData(jsonObject);
msg.setCode("000");
return msg;
}else{
imgMapper.insertImgData(images);
msg.setCode("200");
return msg;
}
}else{
//不查重
imgMapper.insertImgData(images);
msg.setCode("200");
}
return msg;
}
} }
@@ -116,7 +116,6 @@ public class S3Imageupload {
return ret; return ret;
} }
public static Integer Initialize_Tow(Keys k) { public static Integer Initialize_Tow(Keys k) {
int ret = -1; int ret = -1;
try { try {
@@ -1,24 +1,31 @@
package cn.hellohao.service.impl; package cn.hellohao.service.impl;
import cn.hellohao.dao.*; import cn.hellohao.config.GlobalConstant;
import cn.hellohao.dao.KeysMapper;
import cn.hellohao.dao.UploadConfigMapper;
import cn.hellohao.dao.UserMapper;
import cn.hellohao.pojo.*; import cn.hellohao.pojo.*;
import cn.hellohao.service.ConfdataService;
import cn.hellohao.service.ImgTempService; import cn.hellohao.service.ImgTempService;
import cn.hellohao.service.SysConfigService;
import cn.hellohao.utils.*; import cn.hellohao.utils.*;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture;
/** /**
* @author Hellohao * @author Hellohao
@@ -27,11 +34,14 @@ import java.util.*;
*/ */
@Service @Service
public class UploadServicel { public class UploadServicel {
private static Logger logger = LoggerFactory.getLogger(UploadServicel.class); private static Logger logger = LoggerFactory.getLogger(UploadServicel.class);
@Autowired
ConfdataService confdataService;
@Autowired
SysConfigService sysConfigService;
@Autowired private UploadConfigMapper uploadConfigMapper; @Autowired private UploadConfigMapper uploadConfigMapper;
@Autowired private KeysMapper keysMapper; @Autowired private KeysMapper keysMapper;
@Autowired private ImgMapper imgMapper; @Autowired private ImgServiceImpl imgServiceImpl;
@Autowired private UserMapper userMapper; @Autowired private UserMapper userMapper;
@Autowired private ImgTempService imgTempService; @Autowired private ImgTempService imgTempService;
@Autowired private GetSource getSource; @Autowired private GetSource getSource;
@@ -40,13 +50,16 @@ public class UploadServicel {
public Msg uploadForLoc( public Msg uploadForLoc(
HttpServletRequest request, HttpServletRequest request,
MultipartFile multipartFile, File file,
String imgName,
Integer setday, Integer setday,
String imgUrl) { JSONObject imgJson,
String md5key) {
Msg msg = new Msg(); Msg msg = new Msg();
try { try {
Confdata dataJson = confdataService.selectConfdata("config");
JSONObject confdata = JSONObject.parseObject(dataJson.getJsondata());
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String imageFileName = "未命名图像";
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
UploadConfig uploadConfig = uploadConfigMapper.getUpdateConfig(); UploadConfig uploadConfig = uploadConfigMapper.getUpdateConfig();
String userip = GetIPS.getIpAddr(request); String userip = GetIPS.getIpAddr(request);
@@ -56,15 +69,8 @@ public class UploadServicel {
u = userMapper.getUsers(u); u = userMapper.getUsers(u);
} }
Integer sourceKeyId = 0; Integer sourceKeyId = 0;
String md5key = null; if (imgJson != null) {
FileInputStream fis = null; Msg imgData = uploadForURL(request, imgJson.getString("imgUrl"),imgJson.getString("referer"));
File file = null;
if (imgUrl == null) {
imageFileName = multipartFile.getOriginalFilename();
file = SetFiles.changeFile_new(multipartFile);
} else {
imageFileName = "URL转存图像";
Msg imgData = uploadForURL(request, imgUrl);
if (imgData.getCode().equals("200")) { if (imgData.getCode().equals("200")) {
file = new File((String) imgData.getData()); file = new File((String) imgData.getData());
} else { } else {
@@ -85,19 +91,10 @@ public class UploadServicel {
return msg; return msg;
} }
if (file.length() > TotleMemory) { if (file.length() > TotleMemory) {
System.err.println("文件大小:" + file.length());
System.err.println("最大限制:" + TotleMemory);
msg.setCode("4006"); msg.setCode("4006");
msg.setInfo("图像超出系统限制大小"); msg.setInfo("图像超出系统限制大小");
return msg; return msg;
} }
try {
fis = new FileInputStream(file);
md5key = DigestUtils.md5Hex(fis);
} catch (Exception e) {
e.printStackTrace();
System.out.println("未获取到图片的MD5,成成UUID");
}
Msg fileMiME = TypeDict.FileMiME(file); Msg fileMiME = TypeDict.FileMiME(file);
if (!fileMiME.getCode().equals("200")) { if (!fileMiME.getCode().equals("200")) {
msg.setCode("4000"); msg.setCode("4000");
@@ -105,10 +102,22 @@ public class UploadServicel {
return msg; return msg;
} }
if (md5key == null || md5key.equals("")) { if (md5key == null || md5key.equals("")) {
md5key = UUID.randomUUID().toString().replace("-", ""); FileInputStream fis = null;
try {
fis = new FileInputStream(file);
md5key = DigestUtils.md5Hex(fis);
} catch (Exception e) {
logger.error("获取MD5错误",e);
}finally{
try {
if (null != fis)
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} }
String prefix = file.getName().substring(file.getName().lastIndexOf(".") + 1); String prefix = file.getName().substring(file.getName().lastIndexOf(".") + 1);
// 判断黑名单
if (uploadConfig.getBlacklist() != null) { if (uploadConfig.getBlacklist() != null) {
String[] iparr = uploadConfig.getBlacklist().split(";"); String[] iparr = uploadConfig.getBlacklist().split(";");
for (String s : iparr) { for (String s : iparr) {
@@ -159,35 +168,13 @@ public class UploadServicel {
imgObj.setMd5key(md5key); imgObj.setMd5key(md5key);
imgObj.setImguid(imguid); imgObj.setImguid(imguid);
imgObj.setFormat(fileMiME.getData().toString()); imgObj.setFormat(fileMiME.getData().toString());
imgObj.setIdname(imageFileName); imgObj.setIdname(imgName);
Integer insertRet = imgMapper.insertImgData(imgObj); // Integer insertRet = imgMapper.insertImgData(imgObj);
if (insertRet == 0) { Msg insertRet = imgServiceImpl.insertImgDataForCheck(imgObj,u,confdata,file.getName());
Images imaOBJ = new Images(); if (insertRet.getCode().equals("000")) {
imaOBJ.setMd5key(md5key); return insertRet;
imaOBJ.setUserid(u == null ? 0 : u.getId());
List<Images> images = imgMapper.selectImgUrlByMD5(md5key);
if (images.size() > 0) {
jsonObject.put("url", images.get(0).getImgurl());
// Keys imgFromKey = keysService.selectKeys(images.get(0).getSource());
// if (imgFromKey.getStorageType().equals(5)) {
// jsonObject.put(
// "url",
// imgFromKey.getRequestAddress()
// + "/ota/"
// + images.get(0).getImgname());
// } else {
// jsonObject.put("url", images.get(0).getImgurl());
// }
jsonObject.put("name", file.getName());
jsonObject.put("imguid", images.get(0).getImguid());
msg.setData(jsonObject);
return msg;
} else {
msg.setInfo("未获取到指定图像");
msg.setCode("110501");
return msg;
}
} }
long stime = System.currentTimeMillis(); long stime = System.currentTimeMillis();
ReturnImage returnImage = getSource.storageSource(key.getStorageType(), map, updatePath, key.getId()); ReturnImage returnImage = getSource.storageSource(key.getStorageType(), map, updatePath, key.getId());
if (returnImage.getCode().equals("200")) { if (returnImage.getCode().equals("200")) {
@@ -203,7 +190,7 @@ public class UploadServicel {
// }) // })
// .start(); // .start();
} else { } else {
imgMapper.deleimgForImgUid(imgObj.getImguid()); imgServiceImpl.deleimgForImgUid(imgObj.getImguid());
msg.setCode("5001"); msg.setCode("5001");
msg.setInfo("上传服务内部错误"); msg.setInfo("上传服务内部错误");
return msg; return msg;
@@ -219,42 +206,97 @@ public class UploadServicel {
} }
} }
public static Msg uploadForURL(HttpServletRequest request, String imgurl) { public CompletableFuture<Msg> mergeFile(HttpServletRequest request, String data, User user){
Msg msg = new Msg(); Msg msg = new Msg();
if (true) { try{
Long imgsize = 0L; JSONObject jsonObj = JSONObject.parseObject(data);
try { String filename = jsonObj.getString("filename");
if (imgsize == 0) { String uuid = jsonObj.getString("uuid");
String ShortUID = SetText.getShortUuid(); String md5 = jsonObj.getString("md5");
String savePath = String classifications = jsonObj.getString("classifications");
request.getSession().getServletContext().getRealPath("/") Integer day = jsonObj.getInteger("day");
+ File.separator String source = jsonObj.getString("source");
+ "hellohaotmp" String imgIdentifier = jsonObj.getString("imgIdentifier");
+ File.separator; JSONArray jsonArray = new JSONArray();
Map<String, Object> bl = ImgUrlUtil.downLoadFromUrl(imgurl, ShortUID, savePath); classifications = classifications==null?"":classifications;
if ((Boolean) bl.get("res") == true) { if(!org.apache.commons.lang3.StringUtils.isBlank(classifications)){
msg.setCode("200"); String[] calssif = classifications.split(",");
msg.setData(bl.get("imgPath")); for (int i = 0; i < calssif.length; i++) {
return msg; jsonArray.add(calssif[i]);
} else {
if (bl.get("StatusCode").equals("110403")) {
msg.setInfo("该链接非图像文件,无法上传");
} else {
msg.setInfo("该链接暂时无法上传");
}
msg.setCode("500");
}
} else {
msg.setCode("500");
msg.setInfo("获取资源失败");
} }
} catch (Exception e) { }
String path = GlobalConstant.HELLOHAOTEMPIMG_PATH+File.separator+uuid+File.separator+imgIdentifier+File.separator+filename;
// if(new File(path).exists()){
// path = GlobalConstant.HELLOHAOTEMPIMG_PATH+File.separator+UUID.randomUUID().toString().replace("-", "").toLowerCase()+filename;
// }
String folder = GlobalConstant.HELLOHAOTEMPIMG_PATH+File.separator+uuid+File.separator+imgIdentifier;
String delFolder = GlobalConstant.HELLOHAOTEMPIMG_PATH+File.separator+uuid;
String originalFilename = filename;
if(StringUtils.isBlank(originalFilename)){
originalFilename = "未命名图像";
}
Msg merge = SetFiles.merge(path, folder, filename);
if(merge.getCode().equals("200")){
File file = new File(path);
// CompletableFuture<Msg> ret =
msg = uploadForLoc(request, file,originalFilename, day, null,md5);
// msg = ret.get();
}else{
msg = merge;
}
SetFiles.delFileFolder(new File(delFolder));
}catch (Exception e){
e.printStackTrace();
msg.setCode("500");
msg.setInfo("文件上传时发生错误");
}
return CompletableFuture.completedFuture(msg);
}
public static Msg uploadForURL(HttpServletRequest request, String imgurls,String referer) {
final Msg msg = new Msg();
String url = imgurls;
// 先判断是不是有效链接 并且自动判断协议头http(s)://
GetProtocol getProtocol = new GetProtocol();
String protocol = getProtocol.getProtocol(url,referer);
if (protocol == null) {
msg.setInfo("服务器解析该链接失败");
msg.setCode("500");
return msg;
} else {
url = protocol;
}
Long imgsize = 0L;
try {
if (imgsize == 0) {
String ShortUID = SetText.getShortUuid();
String savePath =
request.getSession().getServletContext().getRealPath("/")
+ File.separator
+ "hellohaotmp"
+ File.separator;
Map<String, Object> bl = ImgUrlUtil.downLoadFromUrl(url,referer, ShortUID, savePath);
if ((Boolean) bl.get("res") == true) {
// File file = new File();
msg.setCode("200");
msg.setData(bl.get("imgPath")); // savePath + File.separator + ShortUID
return msg;
} else {
if (bl.get("StatusCode").equals("110403")) {
msg.setInfo("该链接非图像文件,无法上传");
} else {
msg.setInfo("该链接暂时无法上传");
}
msg.setCode("500");
}
} else {
msg.setCode("500"); msg.setCode("500");
msg.setInfo("获取资源失败"); msg.setInfo("获取资源失败");
} }
} else { } catch (Exception e) {
msg.setCode("500"); msg.setCode("500");
msg.setInfo("该链接无效"); msg.setInfo("获取资源失败");
} }
return msg; return msg;
@@ -283,9 +325,9 @@ public class UploadServicel {
memory = Long.valueOf(uploadConfig.getVisitormemory()); // 单位 B 游客设置总量 memory = Long.valueOf(uploadConfig.getVisitormemory()); // 单位 B 游客设置总量
TotleMemory = Long.valueOf(uploadConfig.getFilesizetourists()); // 单位 B 游客单文件大小 TotleMemory = Long.valueOf(uploadConfig.getFilesizetourists()); // 单位 B 游客单文件大小
UsedTotleMemory = UsedTotleMemory =
imgMapper.getusermemory(0) == null imgServiceImpl.getusermemory(0) == null
? 0L ? 0L
: imgMapper.getusermemory(0); // 单位 B : imgServiceImpl.getusermemory(0); // 单位 B
} else { } else {
if (uploadConfig.getUserclose() != 1) { if (uploadConfig.getUserclose() != 1) {
msg.setCode("1001"); msg.setCode("1001");
@@ -297,9 +339,9 @@ public class UploadServicel {
memory = Long.valueOf(user.getMemory()); // 单位 B *1024*1024 memory = Long.valueOf(user.getMemory()); // 单位 B *1024*1024
TotleMemory = Long.valueOf(uploadConfig.getFilesizeuser()); // 单位 B TotleMemory = Long.valueOf(uploadConfig.getFilesizeuser()); // 单位 B
UsedTotleMemory = UsedTotleMemory =
imgMapper.getusermemory(user.getId()) == null imgServiceImpl.getusermemory(user.getId()) == null
? 0L ? 0L
: imgMapper.getusermemory(user.getId()); // 单位 B : imgServiceImpl.getusermemory(user.getId()); // 单位 B
} }
if (uploadConfig.getUrltype() == 2) { if (uploadConfig.getUrltype() == 2) {
updatePath = dateFormat.format(new Date()); updatePath = dateFormat.format(new Date());
+13 -12
View File
@@ -1,7 +1,7 @@
package cn.hellohao.utils; package cn.hellohao.utils;
import cn.hellohao.config.GlobalConstant; import cn.hellohao.config.GlobalConstant;
import org.slf4j.Logger; import cn.hutool.core.io.FileUtil;import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@@ -111,7 +111,7 @@ public class FirstRun implements InitializingBean {
RunSqlScript.RunInsert(instartConfdata); RunSqlScript.RunInsert(instartConfdata);
Print.Normal("Add table.confdata"); Print.Normal("Add table.confdata");
} }
// RunSqlScript.RunInsert(inddx_md5key); RunSqlScript.RunInsert(index_imgdata);
RunSqlScript.RunInsert("ALTER TABLE tbed.`user` MODIFY id int auto_increment;"); RunSqlScript.RunInsert("ALTER TABLE tbed.`user` MODIFY id int auto_increment;");
Print.Normal("Stage success"); Print.Normal("Stage success");
@@ -143,11 +143,10 @@ public class FirstRun implements InitializingBean {
private String instartAppclient = "INSERT INTO `appclient` VALUES ('app', 'on', NULL, NULL, 'Hellohao图像托管', 'https://hellohao.nos-eastchina1.126.net/TbedClient/app.png', '1.0.1');"; private String instartAppclient = "INSERT INTO `appclient` VALUES ('app', 'on', NULL, NULL, 'Hellohao图像托管', 'https://hellohao.nos-eastchina1.126.net/TbedClient/app.png', '1.0.1');";
//创建confdata表 //创建confdata表
private String createConfdata = "CREATE TABLE tbed.confdata ( `key` varchar(100) NULL, jsondata LONGTEXT NULL )"; private String createConfdata = "CREATE TABLE tbed.confdata ( `key` varchar(100) NULL, jsondata LONGTEXT NULL )";
private String instartConfdata = private String instartConfdata =
"INSERT INTO `confdata` VALUES ('config', '{\\\"sourcekey\\\":7,\\\"emails\\\":1,\\\"webname\\\":\\\"Hellohao图床\\\",\\\"explain\\\":\\\"Hellohao图像托管,是一家免费开源的图像托管,即时分享你的美好瞬间。\\\",\\\"links\\\":\\\"<p style=\\\\\\\"color:#7c7c88;\\\\\\\">© 2019 <a href=\\\\\\\"http://www.Hellohao.cn/\\\\\\\" target=\\\\\\\"_blank\\\\\\\" title=\\\\\\\"Hellohao\\\\\\\">Hellohao</a><span> - All Rights Reserved</span> </p>\\\",\\\"notice\\\":\\\"也许...|这将是最好用的图床|为了更好的用户体验,建议您注册本站继续免费使用Hellohao图床。本站不得上传任何形式的非法图片,一旦发现,永久删除并禁封账户。情节严重者将相关资料交于相关部门处理。\\\",\\\"domain\\\":\\\"http://127.0.0.1:10088\\\",\\\"background1\\\":\\\"\\\",\\\"sett\\\":\\\"1\\\",\\\"webms\\\":\\\"Hellohao图像托管,是一家免费开源的图像托管,即时分享你的美好瞬间。\\\",\\\"webkeywords\\\":\\\"hellohao图床,图床,图片上传,开源图床,hellohao,图像托管,图片分享\\\",\\\"theme\\\":2,\\\"websubtitle\\\":\\\"这将是你用过最优秀的图像托管程序\\\",\\\"logo\\\":null,\\\"aboutinfo\\\":\\\"<img width=\\\\\\\"300px\\\\\\\" src=\\\\\\\"http://img.wwery.com/hellohao/rPscRYwz.png\\\\\\\"> <br /> <br /> <p>也许,这将是你用到最优秀的图像托管程序</p> <p>本程序为Hellohao图象托管程序</p> <br/> <p style=\\\\\\\"color: #656565;\\\\\\\">作者:hellohao独立开发</p> <p style=\\\\\\\"color: #656565;\\\\\\\">www.hellohao.cn</p>\\\"}');"; "INSERT INTO tbed.confdata VALUES ('config', '{\\\"sourcekey\\\":7,\\\"emails\\\":1,\\\"webname\\\":\\\"Hellohao图床\\\",\\\"explain\\\":\\\"Hellohao图像托管,是一家免费开源的图像托管,即时分享你的美好瞬间。\\\",\\\"links\\\":\\\"<p style=\\\\\\\"color:#7c7c88;\\\\\\\">© 2019 <a href=\\\\\\\"http://www.Hellohao.cn/\\\\\\\" target=\\\\\\\"_blank\\\\\\\" title=\\\\\\\"Hellohao\\\\\\\">Hellohao</a><span> - All Rights Reserved</span> </p>\\\",\\\"notice\\\":\\\"也许...|这将是最好用的图床|为了更好的用户体验,建议您注册本站继续免费使用Hellohao图床。本站不得上传任何形式的非法图片,一旦发现,永久删除并禁封账户。情节严重者将相关资料交于相关部门处理。\\\",\\\"domain\\\":\\\"http://127.0.0.1:10088\\\",\\\"background1\\\":\\\"\\\",\\\"sett\\\":\\\"1\\\",\\\"webms\\\":\\\"Hellohao图像托管,是一家免费开源的图像托管,即时分享你的美好瞬间。\\\",\\\"webkeywords\\\":\\\"hellohao图床,图床,图片上传,开源图床,hellohao,图像托管,图片分享\\\",\\\"theme\\\":2,\\\"websubtitle\\\":\\\"这将是你用过最优秀的图像托管程序\\\",\\\"logo\\\":null,\\\"aboutinfo\\\":\\\"<img width=\\\\\\\"300px\\\\\\\" src=\\\\\\\"http://img.wwery.com/hellohao/rPscRYwz.png\\\\\\\"> <br /> <br /> <p>也许,这将是你用到最优秀的图像托管程序</p> <p>本程序为Hellohao图象托管程序</p> <br/> <p style=\\\\\\\"color: #656565;\\\\\\\">作者:hellohao独立开发</p> <p style=\\\\\\\"color: #656565;\\\\\\\">www.hellohao.cn</p>\\\"}');";
private String inddx_md5key = "ALTER TABLE imgdata ADD INDEX index_md5key_url ( md5key,imgurl)"; private String index_imgdata = "ALTER TABLE imgdata ADD INDEX index_md5key_url ( id,md5key,imgname,imgurl,idname,imguid)";
// create index yarn_app_result_i4 on yarn_app_result (flow_exec_id(100), another_column(50));
private String dynamic = "alter table imgdata row_format=dynamic"; private String dynamic = "alter table imgdata row_format=dynamic";
private String compressed = "alter table imgdata row_format=compressed"; private String compressed = "alter table imgdata row_format=compressed";
@@ -159,14 +158,15 @@ public class FirstRun implements InitializingBean {
//判断目录有没有创建 //判断目录有没有创建
File file = new File(GlobalConstant.LOCPATH); File file = new File(GlobalConstant.LOCPATH);
if(!file.exists()){ if(!file.exists()){
file.mkdirs(); FileUtil.mkdir(file);
file1.mkdirs(); FileUtil.mkdir(file1);
file2.mkdirs(); FileUtil.mkdir(file2);
}else{ }else{
if(!file1.exists()){ if(!file1.exists()){
file1.mkdirs(); FileUtil.mkdir(file1);
}else if(!file2.exists()){ }else if(!file2.exists()){
file2.mkdirs(); FileUtil.mkdir(file2);
} }
} }
} }
@@ -191,7 +191,8 @@ public class FirstRun implements InitializingBean {
System.out.print("文件存在"); System.out.print("文件存在");
} else { } else {
System.out.print("文件不存在"); System.out.print("文件不存在");
f.createNewFile();// 不存在则创建 // f.createNewFile();// 不存在则创建
FileUtil.createTempFile(f);
} }
// BufferedReader input = new BufferedReader(new FileReader(f)); // BufferedReader input = new BufferedReader(new FileReader(f));
// while ((str = input.readLine()) != null) { // while ((str = input.readLine()) != null) {
@@ -0,0 +1,89 @@
package cn.hellohao.utils;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.commons.lang3.StringUtils;
public class GetProtocol {
private final static String HTTP= "http://";
private final static String HTTPS = "https://";
private String newurl;
//判断协议 能连接上则协议正确
public String getProtocol(String url,String referer) {
newurl = clearUrl(url);
url = HTTP + newurl;
if (exists(url,referer)) {
return url;
} else {
url = HTTPS + newurl;
if (exists(url,referer)) {
return url;
} else {
return null;
}
}
}
//清除URL里多余的符号
private String clearUrl(String url) {
if (url.contains(HTTP)) {
url = url.substring(url.lastIndexOf(HTTP) + HTTP.length());
for (int i = 0; i < url.length(); i++) {
if (url.charAt(i) == '/' || url.charAt(i) == '.'
|| url.charAt(i) == '\\') {
} else {
url = url.substring(i);
return url;
}
}
} else if (url.contains(HTTPS)) {
url = url.substring(url.lastIndexOf(HTTPS) + HTTPS.length());
for (int i = 0; i < url.length(); i++) {
if (url.charAt(i) == '/' || url.charAt(i) == '.'
|| url.charAt(i) == '\\') {
} else {
url = url.substring(i);
return url;
}
}
}else{
for (int i = 0; i < url.length(); i++) {
if (url.charAt(i) == '/' || url.charAt(i) == '.'
|| url.charAt(i) == '\\') {
} else {
url = url.substring(i);
return url;
}
}
}
return url;
}
//是否能连接上
private boolean exists(String url,String referer) {
try {
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setConnectTimeout(3000);
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36");
con.setRequestProperty("referer", StringUtils.isBlank(referer)?"no-referrer":referer);
System.out.println(con.getResponseCode() );
return (con.getResponseCode() == 200);
} catch (Exception e) {
return false;
}
}
public static void main(String[] args){
try {
String url = "https://img-blog.csdnimg.cn/cbf3201a3cfe4fc38a7cef006487158c.png";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
String referer = con.getRequestProperty("Referer");
System.out.println("Referer: " + referer);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -2,6 +2,7 @@ package cn.hellohao.utils;
import cn.hellohao.TbedApplication; import cn.hellohao.TbedApplication;
import cn.hellohao.pojo.Msg; import cn.hellohao.pojo.Msg;
import org.apache.commons.lang3.StringUtils;
import java.io.*; import java.io.*;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
@@ -83,14 +84,7 @@ public class ImgUrlUtil {
} }
/** public static Map<String ,Object> downLoadFromUrl(String urlStr,String referer,String fileName,String savePath){
* 从网络Url中下载文件
* @param urlStr
* @param fileName
* @param savePath
* @throws IOException
*/
public static Map<String ,Object> downLoadFromUrl(String urlStr,String fileName,String savePath){
Map<String ,Object> resmap = new HashMap<>(); Map<String ,Object> resmap = new HashMap<>();
Map<String ,String> map = checkURLStatusCode(urlStr); Map<String ,String> map = checkURLStatusCode(urlStr);
@@ -102,11 +96,11 @@ public class ImgUrlUtil {
try { try {
URL url = new URL(urlStr); URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection(); HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestProperty("referer", StringUtils.isBlank(referer) ? "no-referrer" : referer);
//设置超时间为3秒 //设置超时间为3秒
conn.setConnectTimeout(5*1000); conn.setConnectTimeout(5*1000);
//防止屏蔽程序抓取而返回403错误 //防止屏蔽程序抓取而返回403错误
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36");
//得到输入流 //得到输入流
InputStream inputStream = conn.getInputStream(); InputStream inputStream = conn.getInputStream();
//获取自己数组 //获取自己数组
@@ -125,7 +119,6 @@ public class ImgUrlUtil {
inputStream.close(); inputStream.close();
} }
//下载并且保存成功后 判断格式 如果不是图像格式 就删除 //下载并且保存成功后 判断格式 如果不是图像格式 就删除
//
if(new File(saveDir+File.separator+fileName).exists()){ if(new File(saveDir+File.separator+fileName).exists()){
Msg msg = TypeDict.FileMiME(file); Msg msg = TypeDict.FileMiME(file);
if(msg.getCode().equals("200")){ if(msg.getCode().equals("200")){
@@ -144,8 +137,6 @@ public class ImgUrlUtil {
resmap.put("res",false); resmap.put("res",false);
resmap.put("StatusCode","500"); resmap.put("StatusCode","500");
} }
return resmap; return resmap;
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); e.printStackTrace();
@@ -155,7 +146,6 @@ public class ImgUrlUtil {
} }
} }
/** /**
* 从输入流中获取字节数组 * 从输入流中获取字节数组
* @param inputStream * @param inputStream
@@ -1,9 +1,16 @@
package cn.hellohao.utils; package cn.hellohao.utils;
import cn.hellohao.pojo.Chunk;
import cn.hellohao.pojo.Msg;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.*; import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.stream.Stream;
public class SetFiles { public class SetFiles {
// 转换文件方法 // 转换文件方法
@@ -78,7 +85,73 @@ public class SetFiles {
return fileSizeString; return fileSizeString;
} }
public static String generatePath(String uploadFolder, Chunk chunk) {
StringBuilder sb = new StringBuilder();
sb.append(uploadFolder+File.separator).append("/").append(chunk.getIdentifier());
if (!Files.isWritable(Paths.get(sb.toString()))) {
System.err.println("path not exist,create path");
System.err.println(sb.toString());
try {
Files.createDirectories(Paths.get(sb.toString()));
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.append("/")
.append(chunk.getFilename())
.append("-")
.append(chunk.getChunkNumber()).toString();
}
public static Msg merge(String targetFile, String folder, String filename) {
Msg msg = new Msg();
try {
final File file = new File(targetFile);
if (file.exists()){
file.delete();
}
Files.createFile(Paths.get(targetFile));
} catch (IOException e) {
System.out.println("这是一个无伤大雅的错:IOException");
e.printStackTrace();
}
try (Stream<Path> stream = Files.list(Paths.get(folder))) {
stream.filter(path -> !path.getFileName().toString().equals(filename))
.sorted((o1, o2) -> {
String p1 = o1.getFileName().toString();
String p2 = o2.getFileName().toString();
int i1 = p1.lastIndexOf("-");
int i2 = p2.lastIndexOf("-");
return Integer.valueOf(p2.substring(i2)).compareTo(Integer.valueOf(p1.substring(i1)));
})
.forEach(path -> {
try {
//以追加的形式写入文件
Files.write(Paths.get(targetFile), Files.readAllBytes(path), StandardOpenOption.APPEND);
//合并后删除该块
Files.delete(path);
} catch (IOException e) {
msg.setCode("500");
msg.setInfo("合并文件时发生了错误");
e.printStackTrace();
}
});
} catch (IOException e) {
msg.setCode("500");
msg.setInfo("合并文件时发生了错误");
e.printStackTrace();
}
return msg;
}
public static void delFileFolder(File file){
if (file.isDirectory()){
File[] files = file.listFiles();
for (File in: files) {
delFileFolder(in);
}
}
file.delete();
}
} }
+1 -1
View File
@@ -57,6 +57,7 @@ public class SetText {
boolean flag = false; boolean flag = false;
try { try {
String check = "^\\w+@[a-zA-Z0-9]{2,10}(?:\\.[a-z]{2,4}){1,3}$"; String check = "^\\w+@[a-zA-Z0-9]{2,10}(?:\\.[a-z]{2,4}){1,3}$";
// String regex = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"; //这个也可以用
Pattern regex = Pattern.compile(check); Pattern regex = Pattern.compile(check);
Matcher matcher = regex.matcher(email); Matcher matcher = regex.matcher(email);
flag = matcher.matches(); flag = matcher.matches();
@@ -66,6 +67,5 @@ public class SetText {
return flag; return flag;
} }
} }
+7 -1
View File
@@ -49,4 +49,10 @@ spring.datasource.druid.stat-view-servlet.login-password=52BNmXPJL0rQQ3CU
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1 spring.datasource.druid.stat-view-servlet.allow=127.0.0.1
spring.datasource.druid.web-stat-filter.exclusions=false spring.datasource.druid.web-stat-filter.exclusions=false
#log4j.logger.cn.hellohao.dao=DEBUG #log4j.logger.cn.hellohao.dao=DEBUG
log4j2.formatMsgNoLookups=True log4j2.formatMsgNoLookups=True
logging.level.cn.hellohao=DEBUG
logging.file.name=/HellohaoData/tbedlog/tbed_core.log
logging.pattern.console=%blue(%d{yyyy-MM-dd HH:mm:ss,SSS}) [%cyan(%t)] [%yellow(%c)]-[%highlight(%p)] %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
logging.logback.rollingpolicy.clean-history-on-start=true
logging.logback.rollingpolicy.max-history=7
+42 -22
View File
@@ -67,10 +67,46 @@
and and
a.imguid = #{imguid} a.imguid = #{imguid}
</if> </if>
<if test="searchname != null">
and CONCAT(
imgurl,
idname
) LIKE '%${searchname}%'
</if>
<if test="idname != null and idname !=''"> <if test="idname != null and idname !=''">
and idname LIKE '%${idname}%' and idname LIKE '%${idname}%'
</if> </if>
order by a.id desc order by
<choose>
<when test="order == 'desc'">
a.updatetime desc
</when>
<when test="order == 'asc'">
a.updatetime asc
</when>
<when test="order == 'sizeAsc'">
CONVERT(a.sizes,SIGNED) asc
</when>
<when test="order == 'sizeDesc'">
CONVERT(a.sizes,SIGNED) desc
</when>
<otherwise>
a.updatetime desc
</otherwise>
</choose>
<!-- <if test="order == 'desc'">-->
<!-- a.updatetime desc-->
<!-- </if>-->
<!-- <if test="order == 'asc'">-->
<!-- a.updatetime asc-->
<!-- </if>-->
<!-- <if test="order == 'sizeAsc'">-->
<!-- CONVERT(a.sizes,SIGNED) asc-->
<!-- </if>-->
<!-- <if test="order == 'sizeDesc'">-->
<!-- CONVERT(a.sizes,SIGNED) desc-->
<!-- </if>-->
</select> </select>
<insert id="insertImgData" parameterType="cn.hellohao.pojo.Images"> <insert id="insertImgData" parameterType="cn.hellohao.pojo.Images">
@@ -92,27 +128,8 @@
violation, violation,
idname idname
) )
select * from ( VALUES (null, #{imgname}, #{imgurl}, #{userid}, #{updatetime},#{sizes},#{abnormal},#{source},#{imgtype},
SELECT NULL id, #{explains},#{md5key},#{imguid},#{format},#{about},null,#{idname})
#{imgname} imgname,
#{imgurl} imgurl,
#{userid} userid,
#{updatetime} updatetime,
#{sizes} sizes,
#{abnormal} abnormal,
#{source} `source`,
#{imgtype} imgtype,
#{explains} explains,
#{md5key} md5key,
#{imguid} imguid,
#{format} `format`,
#{about} about,
null violation,
#{idname} idname
) temp_t
where
IF((select (select checkduplicate from sysconfig where id =1)=1),
not exists (select md5key from imgdata img_t where temp_t.md5key = img_t.md5key),true)
</insert> </insert>
@@ -190,6 +207,9 @@
<select id="selectImgUrlByMD5" parameterType="string" resultType="cn.hellohao.pojo.Images"> <select id="selectImgUrlByMD5" parameterType="string" resultType="cn.hellohao.pojo.Images">
select imgname,imgurl from imgdata where md5key = #{md5key} select imgname,imgurl from imgdata where md5key = #{md5key}
<if test="userid != null">
and userid = #{userid}
</if>
</select> </select>
<!-- 查询当前用户的近20条数据--> <!-- 查询当前用户的近20条数据-->
+3
View File
@@ -74,6 +74,9 @@
<if test="email != null"> <if test="email != null">
and email = #{email} and email = #{email}
</if> </if>
<if test="username != null">
and username = #{username}
</if>
<if test="uid != null"> <if test="uid != null">
and uid = #{uid} and uid = #{uid}
</if> </if>