nginx + ttomcat+mongodb 上传文件问题

[size=large]
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查看是否有文件块存在即可,存在则说明上传成功。


[/size]
保存文件

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

annan211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值