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

}

取图片

相关推荐
程序员小远14 天前
自动化测试基础知识总结
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
LT101579744414 天前
2026年Web自动化测试工具选型指南:多浏览器兼容解决方案
前端·测试工具·自动化
程序员三藏15 天前
Web自动化测试详解
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
专业机床数据采集15 天前
基于 Wireshark 抓包逆向设备通信协议,并用 C# UDP协议跨平台 实现宝元数控程序列表读取、上传、下载和删除
网络·测试工具·wireshark·程序传输·宝元数控·dnc·数控程序传输
程序员龙叔15 天前
从 0 开始学习 AI 测试 - 从接口测试来教你如何用 AI 来生成自动化测试代码
自动化测试·软件测试·python·软件测试工程师·测试工具·性能测试·ai测试
Saniffer_SH15 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
川石课堂软件测试15 天前
APP自动化测试|高级手势操作&toast操作
css·功能测试·测试工具·microsoft·fiddler·单元测试·harmonyos
LT101579744415 天前
2026年开源自动化测试工具选型指南:功能与适用场景解析
测试工具·开源·自动化
大叔带刺16 天前
AutoSAR SomeIP配置开发速成_02测试工具开发
测试工具·someip