当前位置: 首页 > news >正文

纯静态网站品牌建设和品牌打造对企业的意义

纯静态网站,品牌建设和品牌打造对企业的意义,优化什么建立生育支持,济南联通网站备案将图片存储在本地数据库中,通过访问后端的静态资源地址来访问图片整体流程通过接口上传文件(MultipartFile本质上是输入流)对内容进行校验将输入流转变为字节数组,确保可重复使用转换图片格式对图片进行保存和数据库中路径的存储一…

将图片存储在本地数据库中,通过访问后端的静态资源地址来访问图片

整体流程

  1. 通过接口上传文件(MultipartFile本质上是输入流)
  2. 对内容进行校验
  3. 将输入流转变为字节数组,确保可重复使用
  4. 转换图片格式
  5. 对图片进行保存和数据库中路径的存储

一、基本代码

代码中的路径尽量使用Paths.get 方法去拼接,而不是直接使用字符串拼接。

Controller层

@PostMapping("/uploadAvatar")public BaseResponse<String> uploadAvatar(@RequestParam MultipartFile file, Long userId) throws IOException {var fileInput = new BufferedInputStream(file.getInputStream());var result = fileService.uploadAvatar(fileInput, userId);return ResultUtils.success(result);}

MultipartFile类不能使用@RequestBody注解

  • @RequestBody:用于将请求体内容反序列化为Java对象,通常处理JSON或XML格式的数据

  • MultipartFile:用于处理文件上传,属于multipart/form-data格式,而不是JSON/XML

Validator校验类

使用了@Component注解

public File avatarValidator(BufferedInputStream fileInput, Long userId) throws IOException {if (!Objects.nonNull(fileInput) || !Objects.nonNull(userId)) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "参数错误");}var queryWrapper = new QueryWrapper();queryWrapper.eq(User::getId, userId);var user = userService.getOne(queryWrapper);if (!Objects.nonNull(user)) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户不存在");}
//        if (!Objects.nonNull(ImageIO.read(fileInput))) {
//            throw new BusinessException(ErrorCode.PARAMS_ERROR, "请上传图片类型文件");
//        }byte[] fileBytes = IoUtil.readBytes(fileInput);final int MAX_SIZE = 10 * 1024 * 1024;if (fileBytes.length > MAX_SIZE) {throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件过大,图片大小不超过10MB");}var image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);try {image = ImgUtil.read(IoUtil.toStream(fileBytes));File tempFile = File.createTempFile("image-", ".jpg");BufferedImage jpgImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);Graphics2D g2d = jpgImage.createGraphics();g2d.setColor(Color.WHITE);g2d.fillRect(0, 0, image.getWidth(), image.getHeight());g2d.drawImage(image, 0, 0, null);g2d.dispose();ImgUtil.write(jpgImage, tempFile);return tempFile;} catch (IOException e) {throw new BusinessException(ErrorCode.OPERATION_ERROR, "图片转换失败");}}
  • 在使用一次输入流之后,再访问这个对象会失效,正确的方式需要将其转变为2进制对象。才能做到多次使用。
  • 二进制对象再变为图片时如果尺寸大于图片的原尺寸,则会出现白色(或黑色)多余内容,请使用ai自行解决。

Impl实现类

@Overridepublic String  uploadAvatar(BufferedInputStream fileInput, Long userId) throws IOException {var image = valid.avatarValidator(fileInput,userId);var extName = FileUtil.extName(image);if (!FileUtil.exist(properties.getUploadBaseDir())){FileUtil.mkdir(properties.getUploadBaseDir());}var currentDate = DateUtil.today();var rand = IdUtil.simpleUUID();var fileName = currentDate + "-" + rand + "." + extName;var IMAGE_PATH = Paths.get("images/avatar", fileName).toString();var queryWrapper = new QueryWrapper();queryWrapper.eq(User::getId,userId);var user = userService.getOne(queryWrapper);if (Objects.nonNull(user.getAvatar())){var oldPath = Paths.get(properties.getUploadBaseDir(),user.getAvatar());var fileQuery = new QueryWrapper();fileQuery.eq(File::getPath,user.getAvatar());var oldFile = this.getOne(fileQuery);this.removeById(oldFile);FileUtil.del(oldPath);}var saveFile = new java.io.File(Paths.get(properties.getUploadBaseDir(), IMAGE_PATH).toString());FileUtil.copy(image.toPath(), saveFile.toPath());//上传新文件user.setAvatar(IMAGE_PATH);userService.updateById(user);image.deleteOnExit();var fileSize = (int)image.length()/1024;var file =new File();file.setType("avatar");file.setPath(IMAGE_PATH);file.setSize( fileSize);file.setCreateId(userId);this.save( file);return IMAGE_PATH;}

二、配置静态资源处理器


public class CorsConfig implements WebMvcConfigurer {private final FileConfig config;public CorsConfig(FileConfig config) {this.config = config;}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {Path avatarDir = Paths.get(config.getUploadBaseDir(), "images/avatar");String normalizedPath = avatarDir.toAbsolutePath().toString().replace("\\", "/");String resourcePath = "file:" + normalizedPath + "/";registry.addResourceHandler("/images/avatar/**").addResourceLocations(resourcePath).setCachePeriod(3600);}
}

三、配置类

@Component
@ConfigurationProperties(prefix = "file.image")
@Data
public class FileConfig {private String uploadBaseDir;
}

在applicaiton.yml或者application.properties中添加自己的路径配置。

#文件上传路径
file:image:upload-base-dir: doc/

四、扩展

图片后续可以存入cos或者使用minIO进行存储,而不是存在本地。

五、前端展示

接口

export async function uploadAvatar(// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)params: API.uploadAvatarParams,body: {},options?: { [key: string]: any }
) {return request<API.BaseResponseString>('/file/uploadAvatar', {method: 'POST',params: {...params,},data: body,...(options || {}),})
}

接口不要添加请求头,不是json的格式

headers: {'Content-Type': 'application/json',},

图片地址

localhost:{后端端口}/{avatarPath}     //avatarPath为后端数据库中存储的路径

http://www.dtcms.com/a/404229.html

相关文章:

  • 企业经营不是赌短期
  • 合肥市做网站的公司有哪些中国字体设计网站
  • vue 使用leaflet加载天地图
  • 网站做宣传网站建设钟振森
  • 怎么选择做网站的公司网店推广发展趋势有哪些
  • 做网站是如果盈利的河南 网站建设
  • 3g手机网站源码国外模板wordpress
  • 纯文字网站设计网站做备案关停会显示什么
  • 贵阳seo网站推广技巧新手做网站做那个
  • JVM 的垃圾处理机制
  • 马克杯网站开发做淘宝客需要自己建网站吗
  • 广州网站建设 推广公司哪家好手机网站制作器
  • 本地使用 Git 向 Gitee 推送项目的全过程、涉及的命令以及每个命令的作用
  • 【0基础学算法】前缀和(算法原理+经典例题)
  • 数据开放网站建设内容wordpress页面分页
  • 网站文章页图片大全win7系统做网站服务器系统
  • 永嘉县住房建设局网站公司网站建设审批流程
  • 鄂尔多斯建设局网站怎么查个人是否注册工商执照
  • 注册公司应该去哪个部门石家庄百度搜索引擎优化
  • 网站优化 图片动画设计的类型有哪些
  • 企业双线策略路由重定向
  • 外国人做外贸都会浏览哪些网站深圳专门做网站的公司
  • 网站渠道建设深圳相册制作公司
  • 网站模板html 汽车膜在线装修设计平台
  • 办公室装修费用分几年摊销上海百度seo点击软件
  • 重庆品牌设计公司品牌推广百度seo
  • 1第五章函数
  • 网站建设相关的博客有哪些网站开发的项目流程
  • cpolar让Nastool影音库随身而行,随时随地享受视听自由
  • wordpress建站系统视频教程wordpress博客视频教程