当前位置: 首页 > 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的用法(路由管理)
  • 【Leetcode】101. 对称二叉树
  • 「面试题」如何实现一个圣杯布局?
  • Android开源项目规范总结
  • Apache的80端口被占用以及访问时报错403
  • CSS 专业技巧
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • k个最大的数及变种小结
  • node入门
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Phpstorm怎样批量删除空行?
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Rancher-k8s加速安装文档
  • vue-router的history模式发布配置
  • 关于Java中分层中遇到的一些问题
  • 区块链共识机制优缺点对比都是什么
  • 使用 @font-face
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 回归生活:清理微信公众号
  • 数据库巡检项
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​MySQL主从复制一致性检测
  • #QT项目实战(天气预报)
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)(1.13) SiK无线电高级配置(六)
  • (c语言)strcpy函数用法
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (转)视频码率,帧率和分辨率的联系与区别
  • .cfg\.dat\.mak(持续补充)
  • .htaccess配置重写url引擎
  • .net core 依赖注入的基本用发
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET技术成长路线架构图
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .net通用权限框架B/S (三)--MODEL层(2)