思路:
1、先保存主要信息,存到数据库。
2、查询这条数据的 id、uid
3、上传附件功能:根据id、uid、文件。请求:附件API接口。
4、后端接口中:先判断登录状态,
5、创建对应的文件夹并存入文件,文件夹名以 id 名 命名。
6、把附件名重命名,以uuid命名。
7、把所有的文件路径放到集合里,传入id、uid 存入到数据库中。
前端:请求带有文件路径的json数据,直接去展示即可。访问路径可直接下载或展示。
先看效果:
接口:
代码:
package org.lgq.ai.controller;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@RestController
@Api(value = "文件上传下载接口", description = "对外接口API")
@RequestMapping("/files")
public class FilesController {
@ResponseBody
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public JSONObject filesUpload(HttpServletRequest request,
@RequestParam("id") String id,
@RequestPart("fileA") MultipartFile fileA,
@RequestPart("fileB") MultipartFile fileB,
@RequestPart("fileC") MultipartFile fileC) throws IOException, ServletException {
//用id用户是否已登录,否则直接跳出。
//......
JSONObject json = new JSONObject();
String path = "D:\\youProject\\files\\" + id + "\\";
//生成一个以id命名的文件夹
Boolean ft = newIdFolder(path);
if (ft) {
//保存文件
int i = 0;
//获取所有文件路径list
List<String> filearr = new ArrayList<String>();
//获取上传状态提示:
List<String> tiparr = new ArrayList<String>();
for (Part part : request.getParts()) {
if (part.getSize() >= 7 * 1024 * 1024) {
tiparr.add(part.getSubmittedFileName() + "文件太大,仅支持上传 7M 以内的文件。请重新上传。");
} else {
part.getContentType();
part.getSize();
part.getSubmittedFileName();
part.getName();
if (part.getContentType() != null) {
String fileurl = path + reFileName(part.getSubmittedFileName());
//文件存入本机文件夹中:
part.write(fileurl);
//获取所有文件路径:
filearr.add(fileurl);
//上传状态:
tiparr.add(part.getSubmittedFileName() + "文件上传成功。");
i++;
} else {
request.getParameter(part.getName());
}
}
}
//文件路径存入数据库中:(先保存主信息得到id,uid后上传文件)
//xxxService.fileToDate(id,uid,filearr.toString());
if (i >= 1) {
json.put("code", "200");
json.put("info", tiparr.toString());
} else {
json.put("code", "500");
json.put("info", "上传失败。");
}
}
return json;
}
/**
* 生成一个以id命名的文件夹
*
* @param path
*/
private Boolean newIdFolder(String path) {
File file = new File(path);
return file.mkdirs();
}
/**
* 文件名称以uuid命名
*
* @param filename
* @return
*/
private String reFileName(String filename) {
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
String lastname = filename.split("\\.")[1];
return uuid + "." + lastname;
}
}
其实还可以改改,判断下文件类型、输入日志、上传状态、加入时间、存入名称等等。
其实上述代码只是个demo,若用到实际工作中还有多处需要改进的。