- 实体类
- controller
- service
- 数据转换的工具类
- file工具类
Hutool-http针对JDK的HttpUrlConnection做一层封装,简化了HTTPS请求、文件上传、cookie记忆等操作,使Http请求变得无比简单。
用的是smms图床。
依赖:
实体类cn.hutool hutool-all 5.7.12
@Data
public class PictureDto implements Serializable {
private Long id;
private Timestamp createTime;
private String deleteUrl;
private String filename;
private String height;
private String size;
private String url;
private String username;
private String width;
private String md5code;
}
controller
@RestController
@RequestMapping("/api/pictures")
@Api(tags = "工具:免费图床管理")
public class PictureController {
private final IGenerator generator;
private final PictureService pictureService;
public PictureController(IGenerator generator, PictureService pictureService) {
this.generator = generator;
this.pictureService = pictureService;
}
@Log("查询图片")
@PreAuthorize("@el.check('pictures:list')")
@GetMapping
@ApiOperation("查询图片")
public ResponseEntity
service
package co.yixiang.tools.service.impl; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import co.yixiang.common.service.impl.baseServiceImpl; import co.yixiang.common.utils.QueryHelpPlus; import co.yixiang.dozer.service.IGenerator; import co.yixiang.exception.BadRequestException; import co.yixiang.tools.domain.Picture; import co.yixiang.tools.service.PictureService; import co.yixiang.tools.service.dto.PictureDto; import co.yixiang.tools.service.dto.PictureQueryCriteria; import co.yixiang.tools.service.mapper.PictureMapper; import co.yixiang.utils.FileUtil; import co.yixiang.utils.TranslatorUtil; import co.yixiang.utils.ValidationUtil; import co.yixiang.utils.YshopConstant; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.*; // 默认不使用缓存 //import org.springframework.cache.annotation.CacheConfig; //import org.springframework.cache.annotation.CacheEvict; //import org.springframework.cache.annotation.Cacheable; @Service //@AllArgsConstructor //@CacheConfig(cacheNames = "picture") @Transactional(propagation = Propagation.SUPPORTS, readonly = true, rollbackFor = Exception.class) public class PictureServiceImpl extends baseServiceImpl数据转换的工具类implements PictureService { private final IGenerator generator; // IGenerator是一个自定义的数据转化接口 @Value("${smms.token}") private String token;//是用于图床上传文件的token //在yml文件中配置: //# sm.ms 图床的 token //smms: // token: 1oOP3ykFDI0K6ifmtvU7c8Y1eTWZSlyl private static final String SUCCESS = "success"; private static final String CODE = "code"; private static final String MSG = "message"; public PictureServiceImpl(IGenerator generator) { this.generator = generator; } @Override //@Cacheable public Map queryAll(PictureQueryCriteria criteria, Pageable pageable) { getPage(pageable); PageInfo page = new PageInfo<>(queryAll(criteria)); Map map = new linkedHashMap<>(2); map.put("content", generator.convert(page.getList(), PictureDto.class)); map.put("totalElements", page.getTotal()); return map; } @Override //@Cacheable public List queryAll(PictureQueryCriteria criteria) { return baseMapper.selectList(QueryHelpPlus.getPredicate(Picture.class, criteria)); } @Override public void download(List all, HttpServletResponse response) throws IOException { List
public interface IGenerator {
T convert(S s, Class clz);
List convert(List s, Class clz);
}
@Component
@Lazy(true)
public class EJBGenerator implements IGenerator {
@Autowired
protected Mapper dozerMapper;
//Mapper 是org.dozer包下的
@Override
public T convert(final S s, Class clz) {
return s == null ? null : this.dozerMapper.map(s, clz);
}
@Override
public List convert(List s, Class clz) {
return s == null ? null : s.stream().map(vs -> this.dozerMapper.map(vs, clz)).collect(Collectors.toList());
}
}
file工具类
public class FileUtil extends cn.hutool.core.io.FileUtil {
private static final int GB = 1024 * 1024 * 1024;
private static final int MB = 1024 * 1024;
private static final int KB = 1024;
private static final DecimalFormat DF = new DecimalFormat("0.00");
public static File toFile(MultipartFile multipartFile) {
// 获取文件名
String fileName = multipartFile.getOriginalFilename();
// 获取文件后缀
String prefix = "." + getExtensionName(fileName);
File file = null;
try {
// 用uuid作为文件名,防止生成的临时文件重复
file = File.createTempFile(IdUtil.simpleUUID(), prefix);
// MultipartFile to File
multipartFile.transferTo(file);
} catch (IOException e) {
e.printStackTrace();
}
return file;
}
public static String getExtensionName(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > -1) && (dot < (filename.length() - 1))) {
return filename.substring(dot + 1);
}
}
return filename;
}
public static String getFileNameNoEx(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > -1) && (dot < (filename.length()))) {
return filename.substring(0, dot);
}
}
return filename;
}
public static String getSize(long size) {
String resultSize;
if (size / GB >= 1) {
//如果当前Byte的值大于等于1GB
resultSize = DF.format(size / (float) GB) + "GB ";
} else if (size / MB >= 1) {
//如果当前Byte的值大于等于1MB
resultSize = DF.format(size / (float) MB) + "MB ";
} else if (size / KB >= 1) {
//如果当前Byte的值大于等于1KB
resultSize = DF.format(size / (float) KB) + "KB ";
} else {
resultSize = size + "B ";
}
return resultSize;
}
public static File upload(MultipartFile file, String filePath) {
//String name = getFileNameNoEx(file.getOriginalFilename());
String suffix = getExtensionName(file.getOriginalFilename());
StringBuffer nowStr = fileRename();
try {
String fileName = nowStr + "." + suffix;
String path = filePath + fileName;
// getCanonicalFile 可解析正确各种路径
File dest = new File(path).getCanonicalFile();
// 检测是否存在目录
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
// 文件写入
file.transferTo(dest);
return dest;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void downloadExcel(List


