一、基本功能
文件上传,也成为uploadFile,是指将本地图片、视频、音频等文件上传到服务器上,可以让其它用户浏览和下载文件。在实际项目开发中文件上传是常用的。由于本项目是自己写接口做的就没有具体的前端代码。
二、代码实现的过程
1. 公共配置类common
package com.demo.kuberclient.common;
/**
* 设置状态码
*/
public class Constast {
//响应返回码
public static final String CODE_OK="200";
public static final String MSG_OK="OK";
//文件上传到服务器的地址
public static final String UPLOAD_PATH="D:/桌面/DCServer/src/main/resources/static/images/";
}
2.工具类Util
package com.demo.kuberclient.utils;
import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSONObject;
import com.decoclouds.kuberclient.common.Constast;
import io.swagger.annotations.Api;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.List;
@Api(tags = "logo图标上传工具类")
public class LogoUntil {
/**
* 根据时间戳生成唯一id
*/
public static String getCurrentTimeTimestamp(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSSS");
return sdf.format(System.currentTimeMillis());
}
// 文件上传返回的 JSON 字符串格式
public static String getFileJSONString(List<String> url,List<String> list) {
JSONObject json = new JSONObject();
json.put("code", Constast.CODE_OK);
json.put("msg", Constast.MSG_OK);
json.put("url", url);
json.put("filename",list);
return json.toJSONString();
}
/**
* 文件下载查看
* @param path
* @return
*/
public static ResponseEntity<Object> createResponseEntity(String path) {
System.out.println(path);
//1,构造文件对象
File file=new File(Constast.UPLOAD_PATH, path);
System.out.println(file.toString());
System.out.println(file.exists());
if(file.exists()) {
//将下载的文件,封装byte[]
byte[] bytes=null;
try {
bytes = FileUtil.readBytes(file);
} catch (Exception e) {
e.printStackTrace();
}
//创建封装响应头信息的对象
HttpHeaders header=new HttpHeaders();
//封装响应内容类型(APPLICATION_OCTET_STREAM 响应的内容不限定)
header.setContentType(MediaType.APPLICATION_JSON);
//创建ResponseEntity对象
ResponseEntity<Object> entity= new ResponseEntity<Object>(bytes, header, HttpStatus.CREATED);
System.out.println(entity);
return entity;
}
return null;
}
}
我是根据时间戳生成的文件名字具体自己实现,也可用UUID
3.Controller
package com.demo.kuberclient.controller;
import com.decoclouds.kuberclient.common.Constast;
import com.decoclouds.kuberclient.utils.LogoUntil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/logoUpload")
@Api(tags = "logo图片上传")
public class FileController {
/**
* 文件上传
* @param file
* @return
*/
@ApiOperation(value = "上传文件", notes = "接受String类型参数")
@PostMapping("/uploadFile")
@ResponseBody
public String uploadMdPic(MultipartFile[] file, HttpServletRequest request) {
String url = null; // 图片访问地址
String fileFolderName = LogoUntil.getCurrentTimeTimestamp();
System.out.println("获取前端踹过来的文件数据"+file);
List<String> list = new ArrayList<>();
List<String> list1 = new ArrayList<>();
if (file.length > 0) {
//循环多次上传多个文件
for (MultipartFile files : file) {
if (!files.isEmpty()) {
try {
// 获取上传文件的名称
String trueFileName = files.getOriginalFilename();
list.add(trueFileName);
System.out.println("获取文件名称"+trueFileName);
// 图片存储路径
File dest = new File(Constast.UPLOAD_PATH + fileFolderName + '/' + trueFileName);
System.out.println("获取文件路径"+dest);
// 图片访问地址
if (trueFileName.contains(".json")) {
url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() +
"/dcserver/logoUpload/readFileByPath/" + fileFolderName + "/" + trueFileName;
list1.add(url);
}else{
url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() +
"/dcserver/logoUpload/readFileByPath/" + fileFolderName + "/" + trueFileName;
list1.add(url);
}
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
if (dest.exists()) {
continue;
}
files.transferTo(dest);
} catch (Exception e) {
e.printStackTrace();
continue;
}
continue;
}
}
}
String Url = LogoUntil.getFileJSONString(list1,list);
return Url;
}
/**
* 图片下载并读取
*/
@RequestMapping("/readFileByPath/{fileFolderName}/{fileName}")
public ResponseEntity<Object> showImageByPath(@PathVariable(value = "fileFolderName") String fileFolder, @PathVariable(value = "fileName") String fileName){
StringBuilder path = new StringBuilder();
path.append(fileFolder);
path.append("/");
path.append(fileName);
return LogoUntil.createResponseEntity(path.toString());
}
}
因为前端需要回显,我就顺便做个了回显,回显为Json类型的,可以通用,具体返回什么,可自行调整。因为就是自己写接口自己测,我用的Apipost测试的,前端我就不上传代码了,可以自行测试,效果就只能在接口中看到。
这是在做的过程中,觉得这一块感觉还可以记录下,如果有更好的方法可以和我一起探讨哦!
版权声明:本文为weixin_56445565原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。