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

}

取图片

相关推荐
测试杂货铺1 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
小码哥说测试3 小时前
接口测试用例设计的关键步骤与技巧解析!
自动化测试·测试工具·jmeter·职场和发展·测试用例·接口测试·postman
awonw18 小时前
[java][框架]springMVC(1/2)
测试工具·postman
钱钱钱端21 小时前
【压力测试】如何确定系统最大并发用户数?
自动化测试·软件测试·python·职场和发展·压力测试·postman
迃幵chen1 天前
wireshark-网络分析工具
网络·测试工具·wireshark
孤蓬&听雨1 天前
RabbitMQ自动发送消息工具(自动化测试RabbitMQ)
分布式·测试工具·自动化·rabbitmq·自动发送消息
土小帽软件测试1 天前
jmeter基础01-2_环境准备-Mac系统安装jdk
java·测试工具·jmeter·macos·软件测试学习
qq_433716951 天前
测试分层:减少对全链路回归依赖的探索!
自动化测试·软件测试·功能测试·测试工具·回归·pytest·postman
qq_433716951 天前
Postman断言与依赖接口测试详解!
自动化测试·软件测试·功能测试·测试工具·mysql·接口测试·postman
如光照1 天前
Linux与Windows中的流量抓取工具:wireshark与tcpdump
linux·windows·测试工具·网络安全