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