package com.roomio.filesystem.controller;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.model.GridFSFile;
import com.roomio.filesystem.pojo.Files;
import com.roomio.filesystem.pojo.RestfulCode;
import com.roomio.filesystem.service.FileSeachService;
import com.roomio.filesystem.utils.FileTypeUtils;
import com.roomio.filesystem.utils.SizeUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.bson.types.ObjectId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 文件上传下载控制类
*/
@Controller
@Api(tags = "文件上传相关接口")
@RequestMapping("/file")
public class FileController {
private static final Logger logger = LoggerFactory.getLogger( FileController.class );
@Autowired
private GridFsTemplate gridFsTemplate;
@Autowired
private GridFSBucket gridFSBucket;
@Autowired
FileSeachService fileSeachService;
@NacosValue(value="${serverpath}",autoRefreshed=true)
private String SERVERPATH;
@NacosValue(value="${filepath}",autoRefreshed=true)
private String FILEPATH;//linux
//private static final String PATH="/Users/roooomio/Downloads";//mac
/**
* 上传文件
*
* @param file
* @return
* @throws IOException
* @throws ServletException
*/
@RequestMapping(value = "upload", method = RequestMethod.POST , consumes = "multipart/form-data")
@ResponseBody
@ApiOperation("添加文件接口")
public RestfulCode uploadFile( @ApiParam(value = "添加文件接口", required = true)@RequestParam("file") MultipartFile file,
HttpServletRequest request) throws IOException, ServletException {
RestfulCode rc=new RestfulCode();
// 获得提交的文件名
String fileName = file.getOriginalFilename();
File filepath=new File( FILEPATH );
// filepath.setWritable(true, false);
if(!filepath.exists()){
filepath.mkdirs();
//filepath.setWritable(true, false);
logger.info( "创建了缓存目录!" );
}
// 获取文件输入流
InputStream ins = file.getInputStream();
// 获取文件后缀
String prefix=fileName.substring(fileName.lastIndexOf("."));
// 用uuid作为文件名,防止生成的临时文件重复
final File excelFile = File.createTempFile( UUID.randomUUID().toString().replace( "-","" ), prefix,filepath);
// MultipartFile to File
file.transferTo(excelFile);
InputStream is = new FileInputStream(excelFile);
// 获取文件类型
String contentType = file.getContentType();
// 将文件存储到mongodb中
ObjectId objectId = gridFsTemplate.store( is, fileName, contentType );
// 文件存储成功
try {
if (objectId != null && !"".equals( objectId )) {
Files files = new Files();
files.setName( fileName );
files.setContentType( contentType );
files.setId( System.currentTimeMillis() );
//解决mongodb时区问题
Calendar calendar = Calendar.getInstance();
Date now = new Date();
calendar.setTime( now );
calendar.add( Calendar.HOUR_OF_DAY, 8 );
files.setUploadDate( calendar.getTime() );
files.setSize( SizeUtils.calSize( file.getSize() ) );
// 网页端传输
files.setResouse( "web" );
//获取文件类型
String filetype = FileTypeUtils.getType( ins );
if (prefix.endsWith( "txt" )) {
filetype = "TXT";
}
if ("".equals( filetype)) {
filetype = "OTHER";
}
files.setFileType( filetype );
files.setPath( SERVERPATH+request.getContextPath() + "/file/download/" + objectId );
files.setMd5( objectId.toString() );
Object o = fileSeachService.insertTable( files );
logger.info( "插入数据:" + o );
rc.setCode( 200 );
rc.setMsg( "保存成功!" );
rc.setData( "objectId:" + objectId );
} else {
rc.setCode( 500 );
rc.setMsg( "保存失败!" );
}
//关闭所有的流
if (is != null) {
is.close();
}
//关闭所有的流
if (ins != null) {
ins.close();
}
//删除临时的文件
if (excelFile.exists()) {
excelFile.delete();
logger.info( "删除临时文件成功!" );
}
//logger.info( "保存成功,objectId:" + objectId );
}catch (Exception e){
//如果保存表失败就删除已经存入的数据
Query query = Query.query( Criteria.where( "_id" ).is( objectId.toString() ) );
// 查询单个文件
GridFSFile gridFSFile = gridFsTemplate.findOne( query );
if (gridFSFile != null) {
//删除文档中数据
gridFSBucket.delete( objectId );
}
rc.setCode( 500 );
rc.setMsg( "保存失败!" );
e.printStackTrace();
}
return rc;
}
/**
* 下载文件
*
* @param fileId
* @param request
* @param response
* @throws IOException
*/
@RequestMapping(value = "/download/{fileId}", method = {RequestMethod.GET, RequestMethod.POST})
public void downloadFile(@PathVariable String fileId,
HttpServletRequest request,
HttpServletResponse response) throws IOException {
logger.info( "准备下载文件...." );
Query query = Query.query( Criteria.where( "_id" ).is( fileId ) );
// 查询单个文件
GridFSFile gridFSFile = gridFsTemplate.findOne( query );
logger.info( "文件类型:" + gridFSFile.getMetadata().get( "_contentType" ).toString() );
if (gridFSFile == null) {
return;
}
String fileName = gridFSFile.getFilename().replace( ",", "" );
String contentType = gridFSFile.getMetadata().get( "_contentType" ).toString();
// 通知浏览器进行文件下载
response.setHeader("Content-Length", ""+gridFSFile.getLength());//添加文件长度,可以做到进度条和文件大小
response.setContentType( contentType );
response.setHeader("Content-Disposition" ,"attachment;filename=\"" +fileName+ "\"");//下载文件的名称
GridFSDownloadStre
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,适合用作毕业设计、课程设计作业等,项目均经过测试,可快速部署运行! 基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,适合用作毕业设计、课程设计作业等,项目均经过测试,可快速部署运行! 基于node.js、vue、mongodb等技术构建的web系统,界面美观,功能齐全,适合用作毕业设计、课程设计作业等,项目均经过测试,可快速部署运行!
资源推荐
资源详情
资源评论
收起资源包目录
基于mongodb+nacos+springboot 的文件管理系统后台.zip (25个子文件)
project_demo
pom.xml 6KB
src
main
resources
index.html 271B
application.yml 435B
java
com
roomio
filesystem
ServletInitializer.java 432B
controller
FileController.java 18KB
FileSearchController.java 2KB
utils
FileTypeUtils.java 4KB
SizeUtils.java 800B
DateUtils.java 1KB
pojo
Paging.java 2KB
RestfulCode.java 512B
enums
FileType.java 4KB
Attachment.java 428B
Files.java 4KB
service
FileSeachService.java 5KB
FilesystemApplication.java 1KB
config
SwaggerConfig.java 1015B
MongoConfig.java 2KB
docker
Dockerfile 331B
Dockerfile 417B
.gitignore 365B
run.sh 778B
.drone.yml 2KB
files_back
nacosconfig.yaml_back 452B
dockerfile编辑.jpg 36KB
共 25 条
- 1
资源评论
白话机器学习
- 粉丝: 1w+
- 资源: 7693
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功