`
annan211
  • 浏览: 461191 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

nginx + ttomcat+mongodb 上传文件问题

 
阅读更多

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;
    }
分享到:
评论

相关推荐

    Nginx+upload+lua实现简单文件上传服务

    本教程将详细解析如何使用Nginx、upload模块以及lua来搭建一个简单的文件上传系统。 首先,我们需要了解Nginx的ngx_http_upload_module模块,这是一个用于处理HTTP POST请求中的文件上传的第三方模块。它允许我们在...

    PHP高级工程师必知必会Nginx+keepalived+MongoDB+haproxy+Sphinx实现分布式集群部署实战视频

    - **高可用性**:选择Nginx + keepalived作为前端层方案,能够有效避免单点故障问题;MongoDB集群与Sphinx分布式部署进一步增强了整体系统的稳定性和可靠性。 - **高性能**:Nginx优秀的并发处理能力和haproxy强大的...

    Nginx+Uwsgi+Django+Vue部署

    Nginx+Uwsgi+Django(python3)+Vue部署,一步步实现。网上找了N多篇文章都没成功,特意记录,以免其他同学踩坑

    Nginx+tomcat+redis

    - **静态资源处理**:Nginx对静态文件(如CSS、JavaScript、图片等)有出色的处理能力,直接由Nginx返回,减轻了应用服务器的压力。 2. **Tomcat**: Tomcat是Apache软件基金会的Java Servlet和JavaServer Pages...

    Nginx++Keepalived+Tomcat负载均衡&动静分离

    Nginx++Keepalived+Tomcat负载均衡&动静分离配置 本文主要介绍了Nginx、Keepalived和Tomcat的负载均衡和动静分离配置,旨在帮助读者了解如何搭建高可用、高性能的Web应用系统。 一、环境准备 在开始配置之前,...

    解决nginx+php-fpm无法上传文件问题.docx

    解决nginx+php-fpm无法上传文件问题 一、nginx配置文件中的client_max_body_size设置 在nginx配置文件中,client_max_body_size指令用于设置客户端能够上传的最大文件大小。默认情况下,该值设置为1M,导致上传大...

    CentOS7 自动化搭建Nginx+PHP7+Mysql+Docker+Docker-Compose Shell脚本

    CentOS7 自动化搭建Nginx+PHP7+Mysql+Docker+Docker-Compose Shell脚本,Docker version 18.06.1-ce,docker-compose version 1.22.0

    centos傻瓜式安装nginx+php+mysql+memcache+mongodb

    Centos傻瓜式安装nginx+php+mysql+memcache+mongodb 本文档将指导您在CentOS系统上安装nginx、php、mysql、memcache和mongodb五个软件包的傻瓜式安装方法。 Nginx安装 Nginx是一款轻量级的Web服务器软件,常用于...

    Web环境搭建:Linux+Nginx+PHP+Mysql+Redis

    Nginx 的网站目录位于 `/var/www/html`,而网站配置文件则位于 `/etc/nginx/sites-available/default`。常用命令如下: - `sudo service nginx start` // 启动 - `sudo service nginx status` // 查看启动状态 - `...

    Nginx+RTMP 推拉流集群方案

    Nginx+RTMP推拉流集群方案是一种流行的视频直播技术架构,它通过结合Nginx Web服务器和RTMP(Real Time Messaging Protocol)流媒体传输协议来实现网络视频直播的推送和接收功能。RTMP协议由Adobe公司开发,主要用于...

    windows服务器部署 nginx+tomcat+mysql服务器端部署 阿里云服务器部署及配置

    详细说明了windows服务器nginx+tomcat+mysql部署及配置(配置阿里云后台安全组,配置域名)很适合新手学习 附件中包含: 1.操作说明文档 2.操作录屏 3.安装所用到的软件安装包 1)Windows Server 2019 数据中心版 ...

    Nginx+tomcat配置集群负载均衡实例

    在Nginx的配置文件(通常为/etc/nginx/nginx.conf或/etc/nginx/sites-available/default)中,你需要创建一个server块来定义监听的端口和服务器名。然后,在location块中设置反向代理,将请求转发到Tomcat集群。可以...

    nginx+tomcat+redis完成session共享

    3. **配置Nginx**:在Nginx配置文件中,设置负载均衡策略,例如轮询、最少连接数或根据session ID进行粘滞会话。使用`proxy_pass`指令将请求转发到正确的Tomcat服务器,并配置`proxy_set_header`以传递session ID。 ...

    Nginx+Keepalived 主备集群拓扑图

    Nginx+Keepalived 组网主备集群网络拓扑图,欢迎下载

    Nginx+KeepAlived+Tomcat负载架构

    - **配置文件**:编辑`/etc/nginx/nginx.conf`文件,添加负载均衡规则。 - 可以使用`ip_hash`指令实现基于客户端IP的会话保持。 ##### 2. KeepAlived配置 - **配置文件**:编辑`/etc/keepalived/keepalived.conf`...

    nginx+lua+redis 集群 连接插件和脚本

    本资源包“nginx+lua+redis集群 连接插件和脚本”正是为了解决这三者之间的协同工作,特别是针对原插件没有密码功能的问题进行了改进,使得安全性得到了提升。 首先,Nginx是一款轻量级的Web服务器/反向代理服务器...

    shell+mysql+NginxLinuxDockerAnsible+Elasticsearch+MongoDB+爬虫-Git

    shell+mysql+nginx+linux+docker+ansible+Elasticsearch+MongoDB+爬虫+Git

    用FFmpeg+nginx+rtmp搭建环境实现推流.docx

    1. 下载文件:从指定链接下载FFmpeg、nginx和RTMP相关文件。 2. 解压文件:将下载的文件解压到指定目录下。 3. 配置nginx:在nginx的配置文件中添加RTMP模块,启用RTMP协议。 4. 运行nginx:使用命令行工具运行nginx...

    Nginx+keepalived+tomcat实现性负载均衡(包含需要的包)

    在这个配置中,keepalived监控Nginx服务器的状态,一旦发现主Nginx出现问题,会自动将流量切换到备用Nginx服务器,实现零中断的故障切换。 然后,Tomcat是Apache软件基金会的Java Servlet和JavaServer Pages(JSP)...

    nginx+tomcat7+memcached session会话保持

    最后,提供的压缩包文件`nginx+tomcat+memcached`可能包含了上述所有组件的配置文件、jar包和安装脚本,帮助用户快速搭建和测试这样的系统。在部署时,务必根据实际网络环境和服务器配置进行适当的调整,确保所有...

Global site tag (gtag.js) - Google Analytics