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
gridfs + nginx + mongodb 实现图片服务器的更多相关文章
- FastDFS 与 Nginx 实现分布式图片服务器
FastDFS 与 Nginx 实现分布式图片服务器 本人的 Ubuntu18.04 用户名为 jj 点我下载所有所需的压缩包文件 一.FastDFS安装 1.安装 fastdfs 依赖包 ① 解压 ...
- nginx+ftp搭建图片服务器(Windows Server服务器环境下)
几种图片服务器的对比 1.直接使用ftp服务器,访问图片路径为 ftp://账户:密码@192.168.0.106/31275-105.jpg 不采用这种方式,不安全容易暴露ftp账户信息 2.直接使 ...
- 转:Linux下使用Nginx搭建简单图片服务器
最近经常有人问图片上传怎么做,有哪些方案做比较好,也看到过有关于上传图片的做法,但是都不是最好的,今天再这里简单讲一下Nginx实现上传图片以及图片服务器的大致理念. 如果是个人项目或者企业小项目,仅 ...
- Nginx发布静态图片服务器
vir-hosts.conf内容 server { listen ; server_name _; location ~ .*\.(gif|jpg|jpeg|png)$ { expires 24h; ...
- windows版nginx+ftp实现图片服务器的搭建
配置图片服务器的一部分参数 resource.properties: #FTP\u76f8\u5173\u914d\u7f6e #FTP\u7684ip\u5730\u5740 FTP_ADDRESS ...
- Nginx+Nodejs搭建图片服务器
图片上传请求由Node处理,图片访问请求由Nginx处理. 1.Nginx配置 #user nobody; worker_processes 1; #error_log logs/error.log; ...
- Centos7 下nginx 搭建文件图片服务器
现在服务器部署nginx yum install -y epel-release yum install nginx -y 安装完成之后 访问ip 由此可见nginx服务是可用的 修改nginx的配置 ...
- Windows Server2012 r2 nginx反向代理图片服务器
1.下载nginx http://nginx.org/en/download.html,本人下载的1.18.0版本 2.下载 Windows Service Wrapper(winsw.exe) v ...
- Nginx+vsftpd搭建图片服务器
安装Nginx 参考:http://www.cnblogs.com/idefav2010/p/nginx-concat.html Nginx配置文件 location ~ .*\.(gif|jpg|j ...
- centos6.5安装配置fastdfs+nginx实现分布式图片服务器
一.准备 yum groupinstall -y "Development Tools"yum install -y wget libevent-devel pcre-devel ...
随机推荐
- LeetCode HOT 100:搜索旋转排序数组
题目:33. 搜索旋转排序数组 题目描述: 一个整数数组,数组每个值都不相同,且该整数数组是一个被旋转过的数组.被旋转过的数组是指,由一个递增的数组,从某一个下标开始往后的元素,移到最开头.举个例子: ...
- SQLMap入门——获取当前网站数据库的用户名称
列出当前网站使用的数据库用户 python sqlmap.py -u http://localhost/sqli-labs-master/Less-1/?id=1 --current-user
- python 之 random.sample() 报ValueError: Sample larger than population or is negative
def device_id(): device = ''.join(random.sample(string.digits, 19)) return device print(device_id()) ...
- 前后端开发必会的 HTTP 协议“十全大补丸”(万字长文)
本文全面介绍了 HTTP 协议相关知识,包括 HTTP 请求报文.响应报文.持久连接.缓存.Cookie 以及 HTTP 版本升级等! HTTP 协议全称为 HyperText Transfer Pr ...
- ssm——spring整理
目录 1.概述 2.Spring工厂与IOC 2.1.为什么要有Spring框架 2.2.什么是IOC 2.Spring工厂对实例注入 2.1.使用标签进行注入 2.2.使用注解进行注入 2.2.3. ...
- java基础篇——异常
异常的三种类型 1.检查型异常:通常是由用户错误或者问题引起,是程序员无法预见的,例如用户要打开一个不存在的文件... 2.运行时异常:最有可能被程序员忽略的异常,可以在编译时被忽略,例如无限递归调用 ...
- Linux c 检测U盘挂载路径方法
思路: 1.使用df -h |grep mnt shell 命令查找到挂载路径信息 本代码是将结果存入文件中,再从文件中解析出路径信息.也可使用fopen直接从管道中读取信息 2.解析出信息最后的/m ...
- 洛谷P3654 First Step题解
这是一道暴力枚举. 大致题意:R行C列的棋盘要放下长度为K的线段,"#"表示无法放置,问有多少种放置方法. 直接贴代码: #include<bits/stdc++.h> ...
- Java基础1-1-4—java基础语法(循环+随机数)
4.循环+随机数 4.1 循环语句-for循环 循环 特征:1.重复做某件事情 2.具有明确的开始和停止标志 for循环格式介绍 public static void main(String[] ar ...
- 一文搞懂工作流审批(Java+activiti)快速开发+自定义工作流配置
前言 activiti工作流引擎项目,企业erp.oa.hr.crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求. 一.项目形式 springboot+v ...