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

posted @ 2020-03-05 21:19  这很周锐  阅读(800)  评论(0编辑  收藏  举报