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

PostMan测试文件上传

后端代码

package com.example.backend.controller;import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.example.backend.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;/*** @author hrui* @date 2024/3/16 1:47*/
@RestController
@RequestMapping("/file")
@Slf4j
public class FileController {//文件上传存储路径private static final String filePath=System.getProperty("user.dir")+"/upload/";/*** 文件上传*/@PostMapping("/upload")public Result upload(MultipartFile file) {synchronized (FileController.class) {//加锁 确保文件名不重复String flag = System.currentTimeMillis() + "";//原始文件名String fileName = file.getOriginalFilename();try {if (!FileUtil.isDirectory(filePath)) {FileUtil.mkdir(filePath);}// 文件存储位置;原逻辑-文件名FileUtil.writeBytes(file.getBytes(), filePath + flag + "-" + fileName);System.out.println(fileName + " --上传成功");//Thread.sleep(1L);} catch (Exception e) {System.err.println(fileName + " --文件上传失败");}return Result.success("上传成功",flag);}}/*** 文件下载*/// @GetMapping映射HTTP GET请求到特定的处理方法
// @PathVariable用来接收请求URL中的flag值@GetMapping("/{flag}")public void avatarPath(@PathVariable String flag, HttpServletResponse response) {// 检查filePath是否是目录,如果不是则创建if (!FileUtil.isDirectory(filePath)) {FileUtil.mkdir(filePath);}// 用于写入响应流的输出流OutputStream os;// 获取filePath路径下的所有文件名List<String> fileNames = FileUtil.listFileNames(filePath);// 从文件名列表中筛选包含flag的文件名,如果没有找到则返回空字符串String avatar = fileNames.stream().filter(name -> name.contains(flag)).findAny().orElse("");try {// 如果avatar不为空,则执行文件下载操作if (StrUtil.isNotEmpty(avatar)) {// 设置响应的头部信息,告诉浏览器这是一个附件下载操作,并提供文件名response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(avatar, "UTF-8"));// 设置响应的内容类型为字节流response.setContentType("application/octet-stream");// 读取filePath和avatar组合后的文件路径的所有字节byte[] bytes = FileUtil.readBytes(filePath + avatar);// 获取响应的输出流os = response.getOutputStream();// 写入字节到响应输出流os.write(bytes);// 刷新输出流os.flush();// 关闭输出流os.close();}} catch (Exception e) {// 如果文件传输失败,打印失败信息System.out.println("文件传输失败");}}public static void main(String[] args) {List<String> fileNames = FileUtil.listFileNames(filePath);}}

取图片

相关文章:

  • 2024Vue高频面试题
  • C/C++火柴棍等式
  • docker搭建firefiy iii
  • 深入了解 大语言模型(LLM)微调方法
  • 如何“使用Docker快速安装Jenkins,在CentOS7”?
  • Qt教程 — 3.4 深入了解Qt 控件:Input Widgets部件(3)
  • NFT数字藏品推广途径有哪些?CloudNEO免费个性定制方案,推广您的NFT
  • 数据挖掘与大数据的结合
  • nginx实现多个域名和集群
  • 信息化项目可行性研究报告模板(第三章)
  • 【相关问题解答1】bert中文文本摘要代码:import时无法找到包时,几个潜在的原因和解决方法
  • ASP.NET-框架分类与详解
  • sqllab第二十六关通关笔记
  • C语言中,基本数据类型介绍
  • Flutter中GetX的用法(路由管理)
  • 《剑指offer》分解让复杂问题更简单
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Angular2开发踩坑系列-生产环境编译
  • Bytom交易说明(账户管理模式)
  • FineReport中如何实现自动滚屏效果
  • Java精华积累:初学者都应该搞懂的问题
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • mockjs让前端开发独立于后端
  • Python学习之路13-记分
  • SQL 难点解决:记录的引用
  • text-decoration与color属性
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • ------- 计算机网络基础
  • 记一次删除Git记录中的大文件的过程
  • 协程
  • 鱼骨图 - 如何绘制?
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 智能合约开发环境搭建及Hello World合约
  • UI设计初学者应该如何入门?
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (13):Silverlight 2 数据与通信之WebRequest
  • (Oracle)SQL优化技巧(一):分页查询
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET CLR基本术语
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net 后台导出excel ,word
  • //解决validator验证插件多个name相同只验证第一的问题
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C++][基础]1_变量、常量和基本类型
  • [C++]类和对象【上篇】
  • [CLickhouse] 学习小计