seo 网站案例,佛山网站建设维护,东北建站,雄安专业网站建设方案前言
好久没有更新spring Boot 这个项目了。最近看了一下docker 的知识#xff0c;后期打算将spring boot 和docker 结合起来。刚好最近有一个上传文件的工作呢#xff0c;刚好就想起这个脚手架#xff0c;将文件上传和下载整理进来。
配置
在application.properties 中增…前言
好久没有更新spring Boot 这个项目了。最近看了一下docker 的知识后期打算将spring boot 和docker 结合起来。刚好最近有一个上传文件的工作呢刚好就想起这个脚手架将文件上传和下载整理进来。
配置
在application.properties 中增加上传文件存放的路径配置
#文件上传目录
file.upload.urlE:/testcontroller 层
上传文件和下载文件都比较简单我们就直接在controller层来编写。也不用在pom.xml 中增加什么依赖。所以直接上代码。在controller 包下创建一个file包在file 包下创建一个FileController 类。
RestController
RequestMapping(file)
Slf4j
public class FileController {Value(${file.upload.url})private String uploadFilePath;RequestMapping(/upload)public String httpUpload(RequestParam(files) MultipartFile files[]){JSONObject objectnew JSONObject();for(int i0;ifiles.length;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();}}上面的代码看起来有点多其实就是一个上传的方法首先通过 MultipartFile 接收文件。这里我用的是file[] 数组接收文件这是为了兼容多文件上传的情况如果只用file 接收然后在接口上传多个文件的话只会接收最后一个文件。这里大家注意一下。看自己的需求我这里兼容多文件所以用数组接收。
然后遍历files 获取文件下面这段代码是判断文件在所在目录是否存在如果不存在就创建对应的目录。 File dest new File(uploadFilePath / fileName);if (!dest.getParentFile().exists()) {dest.getParentFile().mkdirs();}files[i].transferTo(dest);就是将文件存放到对应的服务器这里有一点需要说明一下如果我们上传重复的文件会怎么样么上传重复的文件不会报错后上传的文件会直接覆盖已经上传的文件。
整体代码就是这样。现在就可以实现文件的上传操作。
测试
我们写好之后基本上传功能就已经实现了我们现在来测试一下。启动项目后我们用postman 请求因为我们需要上传文件用get 方式请求不了。 可以看到文件上传成功了由此可见springboot文件上传一个方法就搞定了。
文件下载
其实文件下载不太建议用接口做因为文件下载一般都是下载一些静态文件我们可以先将文件处理好然后通过Nginx 服务下载静态文件这样速度会快很多。但是这里我们还是写一下。代码也很简单就一个方法也写在fileController 类中 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 字符集设置下载后的文件名。然后就是以文件流的方式下载文件了。
测试的话也简单我们启动项目访问接口 http://localhost:9090/zlflovemm/file/download?fileName11http://localhost:9090/zlflovemm/file/download?fileName1.rar可以看到如果文件存在会直接下载不会提示下载成功或者失败。
删除文件
删除文件是很简单的我这里讲一下删除文件下所有文件夹和文件。并做一个定时任务每天清理一次。 Scheduled(cron0 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();}