首页 > 其他分享 >通用的上传下载(线程)

通用的上传下载(线程)

时间:2024-04-14 15:55:39浏览次数:20  
标签:通用 String filePath 上传下载 flag 线程 file import FileUtil

package com.duxiang.backgroundmanagement.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.duxiang.backgroundmanagement.common.Result;
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;

@RestController
@RequestMapping("/files")
public class FileController {

// 文件上传存储路径项目的根目录
private static final String filePath = System.getProperty("user.dir") + "/file/";
private static final String http = "http://localhost:8081/files/";

/**
* 文件上传
*/
@PostMapping("/upload")
public Result upload(MultipartFile file) {
synchronized (FileController.class) {
// 获取当前时间戳
String flag = System.currentTimeMillis() + "";
// 获取原始文件名(就是你上传的文件本身的名字)
String fileName = file.getOriginalFilename();
try {
// 如果没有file文件夹,会给你在项目根目录下创建一个file文件夹
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(http + flag + "-" + fileName);
}
}


/**
* 获取文件
*/
@GetMapping("/{flag}")
public void avatarPath(@PathVariable String flag, HttpServletResponse response) {
if (!FileUtil.isDirectory(filePath)) {
FileUtil.mkdir(filePath);
}
OutputStream os;
List<String> fileNames = FileUtil.listFileNames(filePath);
String avatar = fileNames.stream().filter(name -> name.contains(flag)).findAny().orElse("");
try {
if (StrUtil.isNotEmpty(avatar)) {
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(avatar, "UTF-8"));
response.setContentType("application/octet-stream");
byte[] bytes = FileUtil.readBytes(filePath + avatar);
os = response.getOutputStream();
os.write(bytes);
os.flush();
os.close();
}
} catch (Exception e) {
System.out.println("文件下载失败");
}
}
}

标签:通用,String,filePath,上传下载,flag,线程,file,import,FileUtil
From: https://www.cnblogs.com/stevenduxiang/p/18134238

相关文章

  • 线程
    什么是线程:进程里面的一条执行流程为什么要引入线程这就不得说说进程的缺点了:进程间的切换,会导致TLB、CPU的Cache失效进程之间是隔离的,进程间的通信需要打破隔离的壁障而相较于进程而言,线程的创建和销毁是轻量级的。同一进程的线程之间的切换,不会导致TLB失效、也不......
  • UE4 iOS打印出所有线程的调用栈
    在Xcode15.2中调试UE4游戏(Development包),执行btall打印出所有线程(共116个线程)的调用堆栈*thread#1,queue='com.apple.main-thread',stopreason=signalSIGSTOP*frame#0:0x00000001f9c7d178libsystem_kernel.dylib`mach_msg2_trap+8frame#1:0x00000001f......
  • 解密prompt系列27. LLM对齐经验之如何降低通用能力损失
    前面我们已经聊过众多指令微调的方案,这一章我们重点讨论下如何注入某一类任务或能力的同时,尽可能不损失模型原有的通用指令理解能力。因为在下游或垂直领域应用中,我们设计的推理任务风格或形式,往往很难通过prompt来稳定实现。这种情况下就会依赖微调来注入稳定的推理风格,但同时在......
  • Godot UI线程,Task异步和消息弹窗通知
    目录前言线程安全全局消息IOC注入消息窗口搭建最简单的消息提示简单使用仿ElementUIElementUI效果简单的Label样式如何快速加载多个相同节点修改一下,IOC按钮事件注册总结前言最近我在研究Godot的全局消息,然后发现Godot也是有UI线程限制的,只能在主线程的子线程里面修改UI。线......
  • Csharp线程
    CSharpe线程 目录CSharpe线程C#如何操作线程Thread1.Thread如何开启一个线程呢?2.Thread中常见的API3.thread的扩展封装threadpool一、.NETFramework2.0时代:出现了一个线程池ThreadPool二、线程池如何申请一个线程呢?三、线程等待四、线程池如何控制线......
  • C#开发AutoCAD插件多线程问题2种解决方法
    后台线程不允许操作界面,解决方案委托主线程来操作,在winform中用控件的Invoke方法。CAD插件里,可以用下面两种方法来实现: 方法一(推荐)://主线程:System.Threading.SynchronizationContextctx=null;ctx=Autodesk.AutoCAD.Runtime.SynchronizationContext.Current;if(ctx==......
  • 多线程-多个子线程执行结果插入List集合
    业务场景:将多个子线程的执行结果存入List,但是总会出现List集合的长度小于子线程的执行数的情况1、错误示例(多个线程同时操作同一个List对象,List是线程不安全)packageunitTest;importorg.assertj.core.util.Lists;importjava.util.List;importjava.util.concurrent.Coun......
  • 艾科瑞特科技:自然语言处理-情感分类-中文版-通用基础版
    艾科瑞特科技:自然语言处理-情感分类-中文版-通用基础版关键词:目标检测、目标跟踪、图像识别、图像分类、视频分析、自然语言处理、自然语言分析、计算机视觉、人工智能、AIGC、AI、大模型、多模态大模型、API、Docker、镜像、API市场、云市场、国产软件、信创内容摘要:通用领......
  • 艾科瑞特科技:自然语言处理-情感分类-中文版-通用版
    艾科瑞特科技:自然语言处理-情感分类-中文版-通用版关键词:目标检测、目标跟踪、图像识别、图像分类、视频分析、自然语言处理、自然语言分析、计算机视觉、人工智能、AIGC、AI、大模型、多模态大模型、API、Docker、镜像、API市场、云市场、国产软件、信创内容摘要:中文情感分......
  • ThreadPoolExecutor线程池解析
    ThreadPoolExecutor线程池解析一、ThreadPoolExecutor常见参数jdk中Executors提供了几种常用的线程池,底层都是ThreadPoolExecutor。publicThreadPoolExecutor(intcorePoolSize,//核心线程数intmaximumPoolSize,//最大线程数......