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

}

取图片

相关推荐
程序员三藏10 小时前
如何使用Jmeter进行压力测试?
自动化测试·软件测试·python·测试工具·jmeter·测试用例·压力测试
编程乐学(Arfan开发工程师)11 小时前
42、响应处理-【源码分析】-浏览器与PostMan内容协商完全适配
java·spring boot·后端·测试工具·lua·postman
集成显卡21 小时前
PlayWright | 初识微软出品的 WEB 应用自动化测试框架
前端·chrome·测试工具·microsoft·自动化·edge浏览器
互联网杂货铺1 天前
完美搭建appium自动化环境
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
测试老哥1 天前
Jmeter如何进行多服务器远程测试?
自动化测试·软件测试·功能测试·测试工具·jmeter·测试用例·性能测试
鱼鱼说测试1 天前
postman基础
测试工具·postman
程序员杰哥1 天前
Postman常见问题及解决方法
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·postman
小堃学编程1 天前
Selenium常用函数介绍
selenium·测试工具
2501_915373881 天前
Selenium 和playwright 使用场景优缺点对比
selenium·测试工具
笑口常开的小丸子1 天前
Selenium 中 JavaScript 点击的优势及使用场景
javascript·selenium·测试工具