<!--上传文件-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
import com.yzdx.AiInterviewer.comment.R;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.*;
@RestController
@Slf4j
public class UploadController {
//设置上传文件的最大大小
public static final int MAX_SIZE = 10 * 1024 * 1024;
//设置文件的类型
public static final List<String> AVATAR_TYPE = new ArrayList<>();
static {
AVATAR_TYPE.add("image/png");
AVATAR_TYPE.add("image/gif");
AVATAR_TYPE.add("image/bmp");
AVATAR_TYPE.add("image/jpg");
AVATAR_TYPE.add("image/jpeg");
}
private static final String BASE_URL = "上传文件的服务器地址";//例如 http://localhost:8080
/**
* 上传图片
*
* @param request
*/
@ApiImplicitParams({
@ApiImplicitParam(name = "file", required = true),
})
@PostMapping("/upload_picture")
@ApiOperation(value = "上传图片", notes = "")
public R upLoadPicture(HttpServletRequest request, @RequestParam("file") MultipartFile file) {
//MultipartFile是spring提供的类,可以接收所有的文件的类
log.info(file.getContentType());
if (file.isEmpty()) {
return R.error("请选择文件");
}
if (file.getSize() > MAX_SIZE) {//file.getSize()获取接收文件的大小
return R.error("文件大小超出最大限制");
}
if (!AVATAR_TYPE.contains(file.getContentType())) {//自定义接收文件的类型
return R.error("文件类型不匹配");
}
String uploadPath = request.getSession().getServletContext().getRealPath("/upload/picture/");//获取上传文件的路径(获取项目中名为‘upload’的文件夹)
log.info(uploadPath);
File dir = new File(uploadPath);
if (!dir.exists()) {
dir.mkdirs();//若不存在,则创建该文件夹
}
String originalFilename = file.getOriginalFilename();//获取文件的真实文件名
int index = originalFilename.lastIndexOf(".");//获取文件的后缀名‘.’的位置
String substring = originalFilename.substring(index);//返回文件类型名 例如:.jpg
String filename = UUID.randomUUID().toString().toUpperCase() + substring;//新创建的文件名
File dest = new File(dir, filename);//创建一个空的文件
try {
file.transferTo(dest);
} catch (IOException e) {
System.out.println(e.getMessage());
return R.error("文件存储出现异常");
}
String RealFilePath = BASE_URL + "/upload/picture/" + filename;
Map<String, Object> data = new HashMap<>();
data.put("image", RealFilePath);
data.put("filename", filename);
return R.success(data);//返回图片存储在服务器的地址
}
}
以上代码是java上传文件的代码,其中包含swagger接口的引用,每个人可以根据自己的需求来进行引用,还有R文件是自己定义的返回类,为了在文件上传的过程中出现错误,可以在application里面进行添加一段来对上传的文件进行约束
spring:
servlet:
multipart:
max-file-size: 50MB #单个文件大小限制
max-request-size: 50MB #总文件大小限制(允许存储文件的文件夹大小)
下面是java后端实现文件下载的参考代码
@GetMapping("/download_file")
@ApiOperation(value = "下载文件", notes = "")
public R downLoadFile(HttpServletRequest request, String downloadFilename, HttpServletResponse response) {
String filePath = request.getSession().getServletContext().getRealPath("/upload/files/");
String filePathName = filePath + File.separator + downloadFilename;
BufferedInputStream bins = null;
BufferedOutputStream bouts = null;
try {
//同一个窗口下载多次,清除空白流
response.reset();
File file = new File(filePathName);
if (!file.exists()) {
log.error("要下载的文件不存在:{}", filePathName);
return R.error("要下载的文件不存在:"+filePathName );
}
bins = new BufferedInputStream(new FileInputStream(filePathName));
bouts = new BufferedOutputStream(response.getOutputStream());
String userAgent = request.getHeader("USER-AGENT").toLowerCase();
// 如果是火狐浏览器
if (userAgent.contains("firefox")) {
downloadFilename = new String(downloadFilename.getBytes(), "ISO8859-1");
} else {
downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");
}
//设置发送到客户端的响应的内容类型
response.setContentType("application/download");
//指定客户端下载的文件的名称
response.setHeader("Content-disposition", "attachment;filename=" + downloadFilename);
int len;
byte[] bytes = new byte[1024];
while ((len = bins.read(bytes)) != -1) {
bouts.write(bytes, 0, len);
}
//刷新流
bouts.flush();
log.info("下载完成");
} catch (IOException e) {
log.error("下载文件异常:{}", e.getMessage());
e.printStackTrace();
return R.error(e.getMessage());
} finally {
try {
if (bouts != null) {
bouts.close();
}
if (bins != null) {
bins.close();
}
} catch (IOException e) {
log.error("关闭流异常", e);
e.printStackTrace();
return R.error("关闭流异常");
}
}
return R.success("下载完成");
}
以上代码是根据指定文件目录(/upload/files/)根据文件名称(downloadFilename)进行文件查找,将目录中找到的文件进行操作下载,其中/upload/files/是我自己创建的文件夹,java项目根据request.getSession().getServletContext().getRealPath("/upload/files/") 这个方法寻找项目中的upload/files/文件夹目录。
注:如何创建上传文件的文件目录,在java项目的根目录下如果没有static这个文件夹,那么程序就会将上传的文件存放在零时目录中,我用的是windows系统,我的存储在C盘里面是某个位置,这里我就懒得翻了,有兴趣的可以自行百度一下,如果在java项目的根目录下创建一个static文件夹那么上传的文件就会上传到static文件夹中,如下图
我的文件目录如上图,在java项目的根目录上创建一个文件夹,我这个项目需要上传很多文件类型的文件,基本上跟第一部分上传文件的方法差不多,可以自行修改。这样我们在网页上传的文件就能保存到自己创建的文件夹里面了。例如request.getSession().getServletContext().getRealPath("/upload/picture/");//获取上传文件的路径(获取项目中名为‘upload’的文件夹)获取的就是static文件夹中/upload/picture/ 的位置。
那么这是在开发环境下进行上传文件,那么打包好的jar文件运行在服务器上找到这个static文件夹呢?我们在打包项目成jar文件时,是没有将static文件夹进行打包处理的,所以我们要在上传jar和部署java时,jar文件所在的位置创建一个static文件夹进行存储上传的文件,例如下图:
如上就是java文件进行文件上传和下载的一些分享,有些不足希望大佬们指导指导!还有文件上传到服务器时我的程序将服务器的ip地址+文件的绝对路径 存储在数据库中,所以在更换服务器的时候在数据库中拿出的数据还是原来的服务器的ip地址+文件的绝对路径 希望大佬们能提供一些建议!