在日常的工作当中经常会碰到对文件进行上传、下载以及删除之类的处理操作, 因此特地做一份记录留存下来, 方便到了以后需要的时候能够随时查阅, 第一项内容就是关于文件的上传以及相关配置的说明, 接下来要对具体的配置细节展开说明。
我们首先要做的是, 去定义一下, 那个文件上传到服务器之后呢, 在服务器的上面, 它的这个存放路径在哪里。(.)
#文件上传目录
把文件对应的网址设置成这个路径, 也就是E:/test逻辑层实现。
上传文件的这个操作其实是比较简单的, 所以我们直接就在层面来编写相关的代码就行了, 这一点完全不必在pom.xml文件里去增加任何额外的依赖包, 所以说废话不多说, 咱们就直接上代码吧, 下一步需要在相关的包下面去创建一个对应的类, 其具体的代码内容如下所示。
@RestController@RequestMapping("file")
@Slf4j
public class FileController {
@Value("${file.upload.url}")
private String uploadFilePath;
@RequestMapping("/upload")
public String httpUpload(@RequestParam("files") MultipartFile files[]){
JSONObject object=new JSONObject();
for(int i=0;i
String fileName = files[i].getOriginalFilename(); // 文件名
File dest = new File(uploadFilePath +'/'+ fileName);
if (!
dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
try {
files[i].transferTo(dest);
} catch (Exception e) {
log.error("{}",e);
object.put("success",2);
object.put("result","程序错误,请重新上传");
return object.toString();
}
}
object.put("success",1);
object.put("result","文件上传成功");
return object.toString();
}
上面的代码看起来有点多, 其实就是一个上传的方法。首先, 通过file数组接收文件。这里我用的是file数组来接收文件, 目的是兼容多文件上传的情况。如果只使用file参数接收, 然后在接口上传多个文件和的话, 只能接收到最后一个文件。
File dest = new File(uploadFilePath +'/'+ fileName);if (!
dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
请各位朋友在这里稍微留一下注意, 看一看你们自己那边的实际需求的情况, 因为在这边我这里是处理多文件情况的兼容性, 所以说就用了数组的方式来接收数据, 接着再去遍历那个叫作files的那个东西, 好去拿到那些文件的信息。
下面展示的这一段代码是专门用来判断一个文件是不是在它当前的所在目录里面已经存在了, 如果遇到那种不存在的状况的话, 就会马上去创建出那个对应的目录出来。
files[i].transferTo(dest);这个操作的本质在于将文件放置在其所属的既定服务器端<, >此处存在一个需要明确说明的细节之处<, >假如我们实施了重复文件的传输动作<, >最终呈现的结果是<, >系统方面绝对不会产生错误信号<, >而后面抵达的那个文件会径直对先前已驻留在服务器端的那个文件执行覆盖操作。
整个代码大体上就是这样的状况, 目前阶段就已经可以把文件上传的那个动作给实现出来了。
2.你可以通过该途径来实现文件的下载操作。
事实上, 关于文件下载这一功能, 是不大建议采用接口的方式去实现的。这是因为文件下载大体上都是针对一些静态文件进行的操作, 我们可以先把这些文件处理妥当, 随后借助 Nginx 服务来进行静态文件的下载工作, 这样一来速度的确会快得多。
然而于此之中我们仍旧还是要把这一块内容编写出来。代码方面其实十分简明, 仅仅存在一个特定的方法体, 并且这个方法也是被放置在类之中的, 相关的代码如下所示:
@RequestMapping("/download")public String fileDownLoad(HttpServletResponse response, @RequestParam("fileName") String fileName){
File file = new File(downloadFilePath +'/'+ fileName);
if(!
file.exists()){
return "下载文件不存在";
}
response.reset();
response.setContentType("application/octet-stream");
response.setCharacterEncoding("utf-8");
response.setContentLength((int) file.length());
response.setHeader("Content-Disposition", "attachment;filename=" + fileName );
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));) {
byte[] buff = new byte[1024];
OutputStream os = response.getOutputStream();
int i = 0;
while ((i = bis.read(buff)) !
= -1) {
os.write(buff, 0, i);
os.flush();
}
} catch (IOException e) {
log.error("{}",e);
return "下载失败";
}
return "下载成功";
}
代码也很简单,就是根据文件名判断是否存在文件,不存在就没有文件,存在就将文件下载下来。response设置返回文件的格式,以文件流的方式返回,采用utf-8 字符集,设置下载后的文件名。然后就是以文件流的方式下载文件了。如果文件存在,会直接下载,不会下载成功或者失败。3.文件进行删除操作。
删除这个动作其实一点都不复杂,那么我现在就要在这里把详细的过程讲清楚, 具体来说呢就是在说如何把一个文件夹里面所包含的所有子文件夹还有文件全部给清理掉, 而且接下来还要去设置一个定时执行的任务, 让这个清理工作每天都固定做一次, 当然啦要是你有其他一些特殊的要求的话也是可以根据实际情况来选取和截取其中的某些部分代码的, 具体的内容展现如下:
@Scheduled(cron="0 0 3 * * ?")
private void deleteFiles(){
deleteFile(new File(deleteFilePath));
}
public void deleteFile(File file){
//判断文件不为null或文件目录存在
if (file == null || !
file.exists()){
log.info("暂无文件");
return;
}
//取得这个目录下的所有子文件对象
File[] files = file.listFiles();
//遍历该目录下的文件对象
for (File f: files){
//打印文件名
String name = f.getName();
log.info(name);
//判断子目录是否存在子目录,如果是文件则删除
if (f.isDirectory()){
deleteFile(f);
}else {
f.delete();
}
}
//删除空文件夹 for循环已经把上一层节点的目录清空。
file.delete();
}
```