nginx:1.7.7
tomcat:8.0.3
mongodb:3
nginx+tomcat+mongodb 开发文件存储服务器
发现文件上传之后获取文件失败,怀疑文件上传失败
第一步:检测上传结果
通过nginx获取文件发现失败,网络错误,进而避过nginx 尝试直接通过
tomcat 获取文件 发现是OK的,这时候怀疑是nginx 代理服务出现问题。
修改nginx配置文件,加入upstream 轮训,发现还是不可以。
查看nginx日志,发现是文件权限问题,统一修改为root 或者其他用户,直接使用root 或者其他用户身份
重新启动nginx 服务,一切OK。
总结如下: mongodb 存储文件不需要其他,除非有特殊需求,
上传大小限制在nginx client_max_body_size 200M; 配置。
检查上传成功与否直接在 files 集合中查看是否有该文件,在chunks查看是否有文件块存在即可,存在则说明上传成功。
保存文件
public RtResponse saveFile(RtRequest request) throws Exception {
logger.info("进入附件上传接口....");
RtResponse response = new RtResponse();
Map<String, Object> propers = request.getAttr();
byte[] byt = (byte[]) propers.get("file");
String ticket = (String) propers.get("ticket");
if (AppUtils.isBlank(ticket)) {
response.setCode(ResultCode.NOT_LOGIN);
response.setMsg("用户未登录");
return response;
}
final TokenVo token = (TokenVo) ssoCacheUtil.getObject(ticket);
if (AppUtils.isBlank(token)) {
response.setCode(ResultCode.NOT_LOGIN);
response.setMsg("用户未登录");
return response;
}
InputStream input = new ByteArrayInputStream(byt);
String contentType = (String) propers.get("contentType");
String fileName = (String) propers.get("fileName");
logger.info("附件上传接口 文件流内容...{}", input);
String fileId = UUIDUtil.getKeys();
GridFS photo = new GridFS(mongotemplate.getDb(), "file_collections");
GridFSInputFile fp = photo.createFile(input);
fp.setFilename(fileName);
fp.setId(fileId);
fp.setContentType(contentType);
fp.save();
AttachmentVO attach = new AttachmentVO();
attach.setContentType(contentType);
attach.setFileId(fileId);
attach.setFileName(fileName);
response.setData(attach);
response.setCode(ResultCode.SUCCESS);
return response;
}
下载文件
@RequestMapping(value = "/{project}/{moduel}/{download}/{meth}/{fileId}", method = RequestMethod.GET)
public @ResponseBody void download(HttpServletRequest request, HttpServletResponse hTresponse,
@PathVariable("project") String project, @PathVariable("moduel") String moduel,
@PathVariable("meth") String meth, @PathVariable("download") String download,
@PathVariable("fileId") String fileId) throws IOException {
LOG.info(request.getRequestURI());
String baseUrl = String.format("/%s/%s/%s/%s", project, moduel, download, meth);
RtResponse response = reqUrlDefService.downloadAttachment(baseUrl, request, fileId);
Map<String, Object> data = (Map<String, Object>) response.getData();
String fileName = (String) data.get("fileName");
String contentType = (String) data.get("contentType");
byte[] byt = (byte[]) data.get("fileByte");
String filename = URLEncoder.encode(fileName, "UTF-8");
hTresponse.setContentType(contentType);
hTresponse.setHeader("Content-disposition", "attachment;filename=" + filename);
OutputStream os = hTresponse.getOutputStream();
os.write(byt);
os.flush();
os.close();
}
public RtResponse findOneFile(RtRequest request) throws Exception {
logger.info("进入附件获取接口....");
RtResponse response = new RtResponse();
Map<String, Object> propers = request.getAttr();
String fileId = (String) propers.get("fileId");
if(AppUtils.isBlank(fileId)){
response.setCode(ResultCode.FIELD_ID_IS_NULL);
response.setMsg("附件ID不能为空");
return response;
}
GridFS gridFS = new GridFS(mongotemplate.getDb(), "file_collections");
DBObject query = new BasicDBObject("_id", fileId);
GridFSDBFile gridFSDBFile = gridFS.findOne(query);
if(AppUtils.isBlank(gridFSDBFile)){
response.setCode(ResultCode.ATTACH_MENT_IS_NULL);
response.setMsg("附件不存在");
return response;
}
logger.info("附件接口 文件流内容...{}", gridFSDBFile.getInputStream());
Map<String, Object> maps = new HashMap<String, Object>();
maps.put("fileName", gridFSDBFile.getFilename());
maps.put("contentType", gridFSDBFile.getContentType());
maps.put("fileByte", gridFSDBFile.getInputStream());
response.setCode(ResultCode.SUCCESS);
response.setData(maps);
return response;
}
分享到:
相关推荐
PHP高级工程师必知必会Nginx+keepalived+MongoDB+haproxy+Sphinx实现分布式集群部署实战视频
Nginx+upload+lua实现简单文件上传服务
傻瓜式安装nginx+php+mysql+memcache+mongodb
Nginx+Uwsgi+Django(python3)+Vue部署,一步步实现。网上找了N多篇文章都没成功,特意记录,以免其他同学踩坑
解决nginx+php-fpm无法上传文件问题.docx
Nginx+tomcat+redis软负载均衡需要的一整套资源,还包括了JDK,依赖包等文件
自己做的一个nginx+tomcat+redis完成session共享小例子,包括所需jar,适合初学者,希望大家一起学习交流
nginx+lua+redis通过匹配客户端ip进行灰度发布
详细说明了windows服务器nginx+tomcat+mysql部署及配置(配置阿里云后台安全组,配置域名)很适合新手学习 附件中包含: 1.操作说明文档 2.操作录屏 3.安装所用到的软件安装包 1)Windows Server 2019 数据中心版 ...
用FFmpeg+nginx+rtmp搭建环境实现推流
nginx+lua+redis 集群 连接插件和脚本,原来插件是没有密码功能 故 修改了一下 k可以自己下载使用
Nginx+tomcat配置集群负载均衡实现动静分离实例
Nginx+KeepAlived+Tomcat负载架构 这个可以实现tomcat集群,并且可以使服务器主备机进行切换。如果其中一台机器当机,会自动切换到另一台机器。客服端感受不到服务器当掉。非常实用。
Nginx+keepalived+tomcat实现性负载均衡
CentOS7 自动化搭建Nginx+PHP7+Mysql+Docker+Docker-Compose Shell脚本,Docker version 18.06.1-ce,docker-compose version 1.22.0
shell+mysql+nginx+linux+docker+ansible+Elasticsearch+MongoDB+爬虫+Git
基于Nginx+RTMP 配置推拉流服务器,以及设置回调功能
Nginx++Keepalived+Tomcat负载 均衡 &动 静 分 离。配置
ffmpeg+nginx+nginx-rtmp-module搭建个人直播平台。 使用说明(ffmpeg+nginx+rtmp-module已经整合,支持HTTP,具体配置查看conf/nginx.conf): 1.解压后,运行nginx_start.bat。(查看监控状态 ...
修改yum源;在centos7下直接部署nginx和php,成功访问phpinfo