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);
    }

}

取图片

相关推荐
傻啦嘿哟4 小时前
用Selenium模拟登录淘宝并采集商品信息:从基础到实战
selenium·测试工具
robinspada8 小时前
用mitmproxy替代selenium-wire
selenium·测试工具·mitmproxy·selenium-wire
我的xiaodoujiao8 小时前
从 0 到 1 搭建完整 Python 语言 Web UI自动化测试学习系列 17--测试框架Pytest基础 1--介绍使用
python·学习·测试工具·pytest
Bellafu6668 小时前
下载selenium-ide及使用
ide·selenium·测试工具
将车2448 小时前
自动化测试脚本环境搭建
python·测试工具·自动化
天才测试猿10 小时前
WebUI自动化测试:POM设计模式全解析
自动化测试·软件测试·python·selenium·测试工具·设计模式·测试用例
郁大锤15 小时前
在 Windows 下安装与快速上手 Wireshark(抓包工具)
windows·测试工具·wireshark
2501_9159090619 小时前
tcpdump 抓包数据分析实战,命令、过滤、常见故障定位与真机补充流程
网络·测试工具·ios·小程序·uni-app·iphone·tcpdump
00后程序员张1 天前
tcpdump 抓包分析,命令、过滤技巧、常见症状定位与移动真机补充方案
网络·测试工具·ios·小程序·uni-app·iphone·tcpdump
天生励志1231 天前
【学习总结】AI接口测试-零基础从接口概念到客达天下系统Apifox+DeepSeek接口测试实战全流程
测试工具·apifox