MongoDB + GridFS实现大文件的存储 +工具类



ImagesUtils.java


package com.appleyk.utils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import com.mongodb.DB;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;

/**
 * 
 * @author yukun24@126.com
 * @blob http://blog.csdn.net/appleyk
 * @date 2018年4月3日-上午9:34:52
 */
public class ImagesUtils {

	static MongoClient mongoClient = new MongoClient("localhost", 27017);
	@SuppressWarnings("deprecation")
	static DB db = mongoClient.getDB("tiles");
	static GridFS gfsPhoto = new GridFS(db, "photo");

	/**
	 * 保存文件 定义文件名称,指定文件路径
	 * 
	 * @throws Exception
	 */
	public static void saveOne(String fileName, String filePath) throws Exception {
		File imageFile = new File(filePath);
		GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile);
		gfsFile.setFilename(fileName);
		gfsFile.save();
	}

	/**
	 * 保存文件的二进制 
	 * @param fileName 文件名
	 * @param data     二进制
	 */
	public static void saveOne(String fileName, byte[] data) {
		GridFS gfsPhoto = new GridFS(db, "photo");
		GridFSInputFile gfsFile = gfsPhoto.createFile(data);
		gfsFile.setFilename(fileName);
		gfsFile.save();
		System.err.println("文件名: " + fileName + "---保存成功!");
	}

	/**
	 * 根据文件名称查询相应文件信息
	 */
	public static void findOne(String fileName) {

		GridFSDBFile imageForOutput = gfsPhoto.findOne(fileName);
		System.err.println(imageForOutput);
	}

	/**
	 * 根据文件名称查询相应文件 并返回文件的二进制数据
	 * 由于Java方法不支持缺省参数,因此,随便给个参数,以满足方法的重载
	 */
	public static byte[] findOne(String fileName, boolean bFlag) throws IOException {

		GridFSDBFile imageForOutput = gfsPhoto.findOne(fileName);
		System.err.println(imageForOutput);
		InputStream inputStream = imageForOutput.getInputStream();
		byte[] buffer = new byte[1024];
		int len = 0;
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		while ((len = inputStream.read(buffer)) != -1) {
			bos.write(buffer, 0, len);
		}
		bos.close();
		if(inputStream!=null){
			inputStream.close();
		}
		return bos.toByteArray();
	}

	/**
	 * 打印所有图片 根据DBCursor遍历所有 图片
	 */
	public static void printAll() {

		DBCursor cursor = gfsPhoto.getFileList();
		while (cursor.hasNext()) {
			System.err.println(cursor.next());
		}
	}

	/**
	 * 根据文件名删除 对象
	 * 
	 * @param fileName
	 */
	public static void deleteOne(String fileName) {
		gfsPhoto.remove(gfsPhoto.findOne(fileName));
	}

	/**
	 * 遍历删除所有文件
	 * 
	 * @param fileName
	 */
	public static void deleteAll() {
		DBCursor cursor = gfsPhoto.getFileList();
		int count = 0;
		while (cursor.hasNext()) {
			DBObject object = cursor.next();
			String fileName = (String) object.get("filename");
			gfsPhoto.remove(gfsPhoto.findOne(fileName));
			count++;
		}

		System.err.println("数据清空:done! -- 共计:" + count + "条");
	}

	/**
	 * 保存二进制 -- 磁盘文件
	 * @param data
	 * @param fileName
	 * @param saveDir
	 * @throws Exception
	 * @throws IOException
	 */
	public static void saveAsFile(byte[] data, String fileName, String saveDir) throws Exception, IOException {

		File dirFile = new File(saveDir);
		// 不存在 创建级联目录
		if (!dirFile.exists()) {
			dirFile.mkdirs();
		}

		String newFilePath = saveDir + File.separator + fileName;
		File file = new File(newFilePath);
		if (!file.exists()) {
			file.createNewFile();
		}

		FileOutputStream fos = new FileOutputStream(file);
		fos.write(data);
		if (fos != null) {
			fos.close();
		}

		System.err.println("文件:"+newFilePath+" -- 保存成功!");
	}

	public static void main(String[] args) {
		try {
			saveOne("z_18_x_213356_y_104718","E:/tiles/hn/zz/18/z_18_x_213356_y_104718.jpg");
			byte[] data = findOne("z_18_x_213356_y_104718", true);
            saveAsFile(data, "z_18_x_213356_y_104718.jpg", "C:/tile/zz");
			// printAll();
			// deleteAll();
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}
	}
}


如果不用GridFS存储文件,可以使用BSON Object存储,但是BSON限制文件的大小为4M,超过就报错,这种保存时候,直接传byte[]对象就行。





工具类足够使用,可根据实际情况自行进行扩展

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,非常感谢您的提问。以下是一个使用SpringBoot集成MongoDB和Logback实现日志存储的示例: 1. 添加依赖 在pom.xml中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> ``` 2. 配置MongoDB 在application.yml中添加以下内容: ```yaml spring: data: mongodb: uri: mongodb://localhost:27017/mydb ``` 其中,uri是MongoDB的连接URI,mydb是数据库的名称。 3. 配置Logback 在logback.xml中配置MongoDB的Appender: ```xml <appender name="MONGO" class="de.flapdoodle.embed.log.LogCollectorAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder class="net.logstash.logback.encoder.LogstashEncoder" /> </appender> ``` 其中,LogstashEncoder用于将日志信息转换为JSON格式,方便存储。 4. 配置Logger 在logback.xml中添加Logger: ```xml <logger name="com.example" additivity="false" level="INFO"> <!-- ConsoleAppender --> <appender-ref ref="STDOUT" /> <!-- MongoDBAppender --> <appender-ref ref="MONGO" /> </logger> ``` 其中,name为包名,level为日志记录的最低级别,可以根据实际情况设置。 5. 测试 使用Logging接口记录日志: ```java @Autowired private Logger logger; @Test public void testLogger() { logger.info("This is a test message."); } ``` 记录的日志信息将同时输出到控制台和MongoDB中。 希望以上内容能够对您有所帮助。如果您有其他问题,可以随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值