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; }