文件上传功能开发v1

wxpay
LI-CCONG\李聪聪 8 months ago
parent a285f04fe1
commit 7dd33b86a1

@ -0,0 +1,33 @@
package cc.yunxi.common.utils;
import cn.hutool.core.io.FileTypeUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import java.io.ByteArrayInputStream;
/**
*
*/
public class FileUtils {
/**
*
*
* @param content
* @param originalName
* @return path
*/
public static String generatePath(byte[] content, String originalName) {
String sha256Hex = DigestUtil.sha256Hex(content);
// 情况一:如果存在 name则优先使用 name 的后缀
if (StrUtil.isNotBlank(originalName)) {
String extName = FileNameUtil.extName(originalName);
return StrUtil.isBlank(extName) ? sha256Hex : sha256Hex + "." + extName;
}
// 情况二:基于 content 计算
return sha256Hex + '.' + FileTypeUtil.getType(new ByteArrayInputStream(content));
}
}

@ -6,6 +6,7 @@ import cc.yunxi.config.WxHsyProperties;
import cc.yunxi.domain.dto.UserDTO; import cc.yunxi.domain.dto.UserDTO;
import cc.yunxi.domain.dto.WxLoginDTO; import cc.yunxi.domain.dto.WxLoginDTO;
import cc.yunxi.domain.po.Recycler; import cc.yunxi.domain.po.Recycler;
import cc.yunxi.domain.vo.common.FileUploadReqVO;
import cc.yunxi.enums.UserTypeEnum; import cc.yunxi.enums.UserTypeEnum;
import cc.yunxi.service.IRecyclerService; import cc.yunxi.service.IRecyclerService;
import cc.yunxi.service.impl.CommonService; import cc.yunxi.service.impl.CommonService;
@ -20,8 +21,10 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
@ -31,6 +34,7 @@ import javax.validation.Valid;
@RequestMapping("/common") @RequestMapping("/common")
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j @Slf4j
public class CommonController { public class CommonController {
private final CommonService commonService; private final CommonService commonService;
@ -38,14 +42,14 @@ public class CommonController {
@ApiOperation("回收员登录") @ApiOperation("回收员登录")
@PostMapping("/hsylogin") @PostMapping("/hsylogin")
public CommonResult<UserDTO> hsyLogin(@Valid @RequestBody WxLoginDTO wxLoginDTO) { public CommonResult<UserDTO> hsyLogin(@RequestBody WxLoginDTO wxLoginDTO) {
UserDTO userDTO = commonService.loginByRecycler(wxLoginDTO); UserDTO userDTO = commonService.loginByRecycler(wxLoginDTO);
return CommonResult.success(userDTO); return CommonResult.success(userDTO);
} }
@ApiOperation("散户登录") @ApiOperation("散户登录")
@PostMapping("/shlogin") @PostMapping("/shlogin")
public CommonResult<UserDTO> shLogin(@Valid @RequestBody WxLoginDTO wxLoginDTO) { public CommonResult<UserDTO> shLogin(@RequestBody WxLoginDTO wxLoginDTO) {
// 散户端登录业务 // 散户端登录业务
UserDTO userDTO = commonService.loginByClient(wxLoginDTO); UserDTO userDTO = commonService.loginByClient(wxLoginDTO);
return CommonResult.success(userDTO); return CommonResult.success(userDTO);

@ -0,0 +1,33 @@
package cc.yunxi.controller;
import cc.yunxi.common.domain.CommonResult;
import cc.yunxi.domain.vo.common.FileUploadReqVO;
import cc.yunxi.service.IFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@Api(tags = "文件接口")
@RestController
@RequestMapping("/file")
@RequiredArgsConstructor
@Slf4j
public class FileController {
private final IFileService fileService;
@ApiOperation("文件上传")
@PostMapping(value ="/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public CommonResult<String> upload(FileUploadReqVO uploadReqVO) {
fileService.uploadFile(uploadReqVO);
return CommonResult.success("ok");
}
}

@ -4,25 +4,26 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
@Data @Data
@ApiModel(description = "小程序认证实体") @ApiModel(description = "小程序认证实体")
public class WxLoginDTO { public class WxLoginDTO {
@ApiModelProperty(value = "code", required = true) @ApiModelProperty(value = "code", required = true)
@NotNull @NotBlank(message = "code缺失")
private String code; private String code;
@ApiModelProperty(value = "encryptedData", required = true) @ApiModelProperty(value = "encryptedData", required = true)
@NotNull @NotBlank(message = "登录参数缺失")
private String encryptedData; private String encryptedData;
@ApiModelProperty(value = "iv", required = true) @ApiModelProperty(value = "iv", required = true)
@NotNull @NotBlank(message = "登录参数缺失")
private String iv; private String iv;
@ApiModelProperty(value = "userType (1散户 2回收员)", required = true, example = "1") @ApiModelProperty(value = "userType (1散户 2回收员)", required = true, example = "1")
@NotNull(message = "用户类型缺失") @NotBlank(message = "用户类型缺失")
private String userType; private String userType;
} }

@ -21,8 +21,7 @@ import java.util.Date;
@ApiModel(description = "散户 Response VO") @ApiModel(description = "散户 Response VO")
public class ClientRespVO { public class ClientRespVO {
@ApiModelProperty("自然主键") @ApiModelProperty("主键id")
@TableId("id")
private String id; private String id;
@ApiModelProperty("微信openid") @ApiModelProperty("微信openid")

@ -0,0 +1,21 @@
package cc.yunxi.domain.vo.common;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data
@ApiModel(description = "文件上传 request VO")
public class FileUploadReqVO {
@ApiModelProperty(value = "文件附件", required = true)
@NotNull(message = "文件附件不能为空")
private MultipartFile file;
@ApiModelProperty(value = "自定义文件路径", required = false, example = "bbj.png")
@NotEmpty(message = "文件路径不能为空")
private String path;
}

@ -4,6 +4,8 @@ package cc.yunxi.service;
import cc.yunxi.domain.dto.UserDTO; import cc.yunxi.domain.dto.UserDTO;
import cc.yunxi.domain.dto.WxLoginDTO; import cc.yunxi.domain.dto.WxLoginDTO;
import javax.validation.Valid;
/** /**
* *
*/ */
@ -15,7 +17,7 @@ public interface ICommonService {
* @return UserDTO * @return UserDTO
* @return * @return
*/ */
UserDTO loginByRecycler(WxLoginDTO wxLoginDTO); UserDTO loginByRecycler(@Valid WxLoginDTO wxLoginDTO);
/** /**
@ -23,7 +25,7 @@ public interface ICommonService {
* @param wxLoginDTO * @param wxLoginDTO
* @return UserDTO * @return UserDTO
*/ */
UserDTO loginByClient(WxLoginDTO wxLoginDTO); UserDTO loginByClient(@Valid WxLoginDTO wxLoginDTO);
/** /**

@ -0,0 +1,24 @@
package cc.yunxi.service;
import cc.yunxi.domain.po.Client;
import cc.yunxi.domain.query.ClientQuery;
import cc.yunxi.domain.vo.client.ClientUpdateVO;
import cc.yunxi.domain.vo.common.FileUploadReqVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid;
import java.io.IOException;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-02-28 06:08:09
*/
public interface IFileService {
void uploadFile(@Valid FileUploadReqVO uploadReqVO);
}

@ -21,8 +21,10 @@ import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date; import java.util.Date;
@ -31,6 +33,7 @@ import java.util.Date;
*/ */
@Service @Service
@Slf4j @Slf4j
@Validated
//@CacheConfig(cacheNames = "AUTH_TOKEN") //@CacheConfig(cacheNames = "AUTH_TOKEN")
public class CommonService implements ICommonService { public class CommonService implements ICommonService {

@ -0,0 +1,64 @@
package cc.yunxi.service.impl;
import cc.yunxi.common.exception.BizIllegalException;
import cc.yunxi.common.utils.FileUtils;
import cc.yunxi.domain.vo.common.FileUploadReqVO;
import cc.yunxi.service.IFileService;
import cn.hutool.core.io.FileTypeUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.Valid;
import java.io.IOException;
import java.io.InputStream;
/**
* <p>
*
* </p>
*
* @author ccongli
* @since 2024-02-28 06:08:09
*/
@Service
@Validated
public class FileServiceImpl implements IFileService {
@Override
public void uploadFile(FileUploadReqVO uploadReqVO) {
MultipartFile file = uploadReqVO.getFile();
String path = uploadReqVO.getPath();
// 获取文件源名称
String name = file.getOriginalFilename();
try (InputStream inputStream = file.getInputStream()){
// 获取文件二进制内容
byte[] content = IoUtil.readBytes(inputStream, false);
// 获取文件类型
String fileType = FileTypeUtil.getType(inputStream);
// 文件类型、大小校验 todo
long fileSize = file.getSize();
if (StrUtil.isEmpty(path)) { // 不自定义path时
path = FileUtils.generatePath(content, name);
}
// 源文件name为空时则使用 path 填充
if (StrUtil.isEmpty(name)) {
name = path;
}
// 上传到文件存储位置 todo
FileUtil.writeBytes(content, path);
// 入库操作 todo
} catch (IOException exception) {
throw new BizIllegalException("文件上传失败");
}
}
}
Loading…
Cancel
Save