zoukankan      html  css  js  c++  java
  • gridfs + nginx + mongodb 实现图片服务器

    项目预览网址 : http://trans.waibaobao.cn/file/pics

    安装:前提安装mongodb 作为文件储存库

    1)nginx-gridfs安装

    a、安装所用依赖包 yum -y install pcre-devel openssl-devel zlib-devel git gcc gcc-c++

    b、下载nginx-gridfs 源代码 git clone https://github.com/mdirolf/nginx-gridfs.git(前提安装git)

         进入nginx-gridfs 后

      git checkout v0.8 

      git branch

      git submodule init

      git submodule update

     

    2)a、nginx 下载安装 
    wget http://nginx.org/download/nginx-1.14.2.tar.gz      解压 tar -zxvf
    nginx-1.14.2.tar.gz

    b、进入nginx-1.14.2
    ./configure --prefix=/usr/local/nginx   --with-openssl=/usr/include/openssl --add-module=../nginx-mongodb/nginx-gridf

    c、make -j8 && make install -j8 (此时会多个nginx目录)

    我的报错了

     d、vi objs/Makefile  把第3行的-Werror错误去后  make -j8 && make install -j8

     e、进入nginx的配置文件更改

        server {
            listen       10010;
            server_name  localhost;
    
         
              location /pics/ {
                gridfs zrdb
                field=filename
                type=string;
                mongo 127.0.0.1:27017;
            }
    
    
        }

     test 代表mongodb 数据库名

    pics 为配置java 访问mongodb的访问路径

    mongodb.url=http://47.106.32.125/pics/
    ivs.mongodb.host=47.106.32.125
    ivs.mongodb.port=27017
    ivs.mongodb.database=test

    ok!!!

     下面说下java 怎么实现连接mongodb 数据库

      话不多说上代码:

     1)配置类 加载mongodb dev 的配置文件

    package com.fyun.tewebcore.config;
    
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.JsonSerializer;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.mongodb.MongoClientOptions;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    
    @Component
    @PropertySource("classpath:/config/mongodb-${spring.profiles.active:dev}.properties")
    @Configuration
    public class MongoConfig extends JsonSerializer<String> {
        public static String mongodbUrl;
    
        public static String urlKey = "mongodbUrl";
    
        @Override
        public void serialize(String String, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
            if (StringUtils.isNotEmpty(String))
                jsonGenerator.writeString(mongodbUrl + String);
            else
                jsonGenerator.writeString(" ");
        }
    
    
        @Value("${mongodb.url}")
        public void setMongodbUrl(String mongodbUrl) {
            MongoConfig.mongodbUrl = mongodbUrl;
        }
    
    
        @Bean
        public MongoClientOptions mongoOptions(){
            return MongoClientOptions.builder().maxConnectionIdleTime(3000).build();
        }
    }

     2)写一个文件上传controller 

    package com.fyun.tewebcore.Controller.file;
    import com.fyun.common.model.base.CommonResponse;
    import com.fyun.common.model.base.SystemCode;
    import com.fyun.common.utils.file.MongoGridfsServiceImpl;
    import com.fyun.common.utils.util.StringUtils;
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiOperation;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.multipart.commons.CommonsMultipartFile;
    import javax.servlet.http.HttpServletResponse;
    /**
     * @author zhourui
     * @create 2019/12/31
     */
    @Api("文件上传处理器")
    @RestController
    @RequestMapping("/file")
    public class FileController {
        private static final Logger logger= LoggerFactory.getLogger(FileController.class);
        @Autowired
        private MongoGridfsServiceImpl mongoGridfsService;
        @ApiOperation(value = "文件上传")
        @RequestMapping(value = "/upload", method = RequestMethod.POST)
        @ResponseBody
        public CommonResponse upload(@RequestParam(value = "file",required = false) MultipartFile commonsMultipartFile, HttpServletResponse responses) {
            responses.addHeader("Access-Control-Allow-Origin", "*");
            CommonResponse response = new CommonResponse();
            logger.info("#commonsMultipartFile==getOriginalFilename入参" +commonsMultipartFile.getOriginalFilename());
            logger.info("#commonsMultipartFile==入参" +commonsMultipartFile);
            logger.info("#commonsMultipartFile入参" +commonsMultipartFile.getContentType());
            try {
                String fileName = StringUtils.getFileName(commonsMultipartFile.getOriginalFilename().substring(commonsMultipartFile.getOriginalFilename().lastIndexOf(".")));
                logger.info("#文件名称=="+fileName);
                mongoGridfsService.save(commonsMultipartFile.getInputStream(),fileName);
                response.setCode(SystemCode.SYSTEM_SUCCESS.getCode());
                response.setMessage(SystemCode.SYSTEM_SUCCESS.getMessage());
                response.setData(fileName);
                return response;
            } catch (Exception e) {
                logger.error("未知异常");
                response.setCode(SystemCode.FILE_UPLOAD_EXCEPTION.getCode());
                response.setMessage(SystemCode.FILE_UPLOAD_EXCEPTION.getMessage()+e.getMessage());
                return response;
            }
        }
    }

    3)调服务接口对gridfs实现增删改查

    package com.fyun.common.utils.file;
    import com.mongodb.BasicDBObject;
    import com.mongodb.DB;
    import com.mongodb.DBObject;
    import com.mongodb.MongoClient;
    import com.mongodb.gridfs.GridFS;
    import com.mongodb.gridfs.GridFSDBFile;
    import com.mongodb.gridfs.GridFSInputFile;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.log4j.Logger;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.PostConstruct;
    import java.io.*;
    import java.util.List;
    
    /**
     * Created by 78729 on 2017/7/7.
     */
    @Service
    @PropertySource("classpath:/config/mongodb-${spring.profiles.active:dev}.properties")
    public class MongoGridfsServiceImpl {
    
        private static Logger logger = Logger.getLogger(MongoGridfsServiceImpl.class);
        private GridFS gridFS;
        private MongoClient mongoClient;
        @Value("${ivs.mongodb.host}")
        private String mongoDBServerUrl = "localhost";
        @Value("${ivs.mongodb.port}")
        private String portStr;
        private int port = 27017;
        @Value("${ivs.mongodb.database}")
        private String dataBase;
    
        public void setMongoDBServerUrl(String mongoDBServerUrl) {
            this.mongoDBServerUrl = mongoDBServerUrl;
        }
    
        public void setPort(int port) {
            this.port = port;
        }
    
        public void setDataBase(String dataBase) {
            this.dataBase = dataBase;
        }
    
        @PostConstruct
        public void init() {
            try {
                mongoClient = new MongoClient(mongoDBServerUrl, port);
                DB db = mongoClient.getDB(dataBase);
                gridFS = new GridFS(db);
            } catch (Exception e) {
                logger.error("mongoClient:UnknownHostException", e);
            }
        }
    
    
        public void saveById(InputStream in, String id) {
            GridFSDBFile gridFSDBFile = getById(id);
            if (gridFSDBFile != null) {
                logger.error(String.format("%s,文件已经存在", gridFSDBFile.getFilename()));
                return;
            }
    
            GridFSInputFile gridFSInputFile = gridFS.createFile(in);
            gridFSInputFile.setId(id);
            gridFSInputFile.save();
        }
    
    
        public void save(String filePath, String fileName) {
            GridFSDBFile gridFSDBFile = getByFileName(fileName);
            if (gridFSDBFile != null) {
                logger.error(String.format("%s,文件已经存在", gridFSDBFile.getFilename()));
                return;
            }
            try {
                FileInputStream in = new FileInputStream(new File(filePath));
                byte[] buffer = new byte[in.available()];
                InputStream input = new ByteArrayInputStream(buffer);
    
                GridFSInputFile gridFSInputFile = gridFS.createFile(input, fileName);
                gridFSInputFile.setFilename(fileName);
                gridFSInputFile.save();
            } catch (Exception e) {
                logger.error(String.format("文件:%s,未找到", filePath), e);
            }
        }
    
    
        public void save(InputStream in, String fileName) {
            GridFSDBFile gridFSDBFile = getByFileName(fileName);
            if (gridFSDBFile != null) {
                logger.error(String.format("%s,文件已经存在", gridFSDBFile.getFilename()));
                return;
            }
    
            GridFSInputFile gridFSInputFile = gridFS.createFile(in, fileName);
            gridFSInputFile.setFilename(fileName);
            gridFSInputFile.save();
        }
    
    
        public void save(byte[] in, String saveFileName) {
            GridFSDBFile gridFSDBFile = getByFileName(saveFileName);
            if (gridFSDBFile != null) {
                logger.error(String.format("%s,文件已经存在", gridFSDBFile.getFilename()));
                return;
            }
            try {
                InputStream input = new ByteArrayInputStream(in);
                GridFSInputFile gridFSInputFile = gridFS.createFile(input, saveFileName);
                gridFSInputFile.setFilename(saveFileName);
                gridFSInputFile.save();
            } catch (Exception e) {
                logger.error(String.format("文件:%s,未找到", saveFileName), e);
            }
        }
    
    
        public void save(InputStream in, String fileName, boolean replace) {
            GridFSDBFile gridFSDBFile = getByFileName(fileName);
            if ((gridFSDBFile != null) && (replace)) {
                this.gridFS.remove(fileName);
            }
            GridFSInputFile gridFSInputFile = gridFS.createFile(in, fileName);
            gridFSInputFile.setFilename(fileName);
            gridFSInputFile.save();
        }
    
    
        public GridFSDBFile getById(String id, String outFilePath) {
            DBObject query = new BasicDBObject("_id", id);
            GridFSDBFile gridFSDBFile = gridFS.findOne(query);
            if ((gridFSDBFile != null) && (StringUtils.isNotEmpty(outFilePath))) {
                writeToFile(gridFSDBFile, outFilePath);
            }
            return gridFSDBFile;
        }
    
    
        public GridFSDBFile getById(String id) {
            DBObject query = new BasicDBObject("_id", id);
            return gridFS.findOne(query);
        }
    
        /**
         * 根据id查询文件并通过流的方式返回,
         *
         * @param id 文件ID
         * @return
         */
    
        public InputStream getStreamById(String id) {
            DBObject query = new BasicDBObject("_id", id);
            GridFSDBFile gridFSDBFile = gridFS.findOne(query);
            return gridFSDBFile.getInputStream();
        }
    
    
        public GridFSDBFile getByFileName(String fileName) {
            DBObject query = new BasicDBObject("filename", fileName);
            return gridFS.findOne(query);
        }
    
    
        public GridFSDBFile getByFileName(String fileName, String outFilePath) {
            DBObject query = new BasicDBObject("filename", fileName);
            GridFSDBFile gridFSDBFile = gridFS.findOne(query);
            if ((gridFSDBFile != null) && (StringUtils.isNotEmpty(outFilePath))) {
                writeToFile(gridFSDBFile, outFilePath);
            }
            return gridFSDBFile;
        }
    
    
        public List<GridFSDBFile> getListByFileName(String fileName) {
            DBObject query = new BasicDBObject("filename", fileName);
            List gridFSDBFileList = gridFS.find(query);
            return gridFSDBFileList;
        }
    
    
        public void removeById(String id) {
            DBObject remove = new BasicDBObject("_id", id);
            gridFS.remove(remove);
        }
    
    
        public void removeByFileName(String fileName) {
            gridFS.remove(fileName);
        }
    
        private void writeToFile(GridFSDBFile gridFSDBFile, String outFilePath) {
            try {
                gridFSDBFile.writeTo(outFilePath);
            } catch (IOException e) {
                logger.error(String.format("%s,文件输出异常", gridFSDBFile.getFilename()), e);
            }
        }
    
    }


    wget http://nginx.org/download/nginx-1.14.2.tar.gz

  • 相关阅读:
    关于slot标签的使用
    vue组件
    template和component的理解(待更正)
    input 的属性autocomplete
    关于render: h => h(App)和components: { App }的区别
    关于vue的简单知识
    获取页面跳转携带的参数
    关于跨域的简单想法(此想法是错误的,特此备注)
    关于jq建立类似与双向绑定的函数
    关于jq将一个页面引入另一个页面,类似与组件化的解决方案
  • 原文地址:https://www.cnblogs.com/zrboke/p/12422785.html
Copyright © 2011-2022 走看看