Java操作Mongodb之文件读写

来源:互联网 发布:python 计算 macd 编辑:程序博客网 时间:2024/05/19 05:01

Maven依赖:

<dependency><groupId>org.mongodb.morphia</groupId><artifactId>morphia</artifactId><version>1.1.0</version><exclusions><exclusion><artifactId>mongo-java-driver</artifactId><groupId>org.mongodb</groupId></exclusion></exclusions></dependency><dependency><artifactId>mongo-java-driver</artifactId><groupId>org.mongodb</groupId><version>3.0.2</version></dependency>

**Controller.java中的Mapping映射:

@RequestMapping(value = "/uploadFileToMongo")public JSONMessage uploadFileToMongo(MultipartFile file, String id, String filename, String collection){if (file != null && file.getName() != null && !file.isEmpty()) {byte[] bytes=null;try {bytes = file.getBytes();} catch (IOException e) {e.printStackTrace();}MongoFileOperationUtil.saveFile(bytes ,id, filename, collection);return JSONMessage.success();} else {return JSONMessage.failure("上传文件为空!");}}@RequestMapping(value = "/downloadFileFromMongo")public JSONMessage downloadFileFromMongo(String id, String filename, String collection, String contentType) {try {response.setHeader("Content-Disposition", "attachment;fileName=" + filename);InputStream inputStream = MongoFileOperationUtil.readFile(id, filename, collection, contentType);OutputStream os = response.getOutputStream();byte[] b = new byte[2048];int length;while ((length = inputStream.read(b)) > 0) {os.write(b, 0, length);}os.close();inputStream.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return JSONMessage.success();}@RequestMapping(value = "/removeFileFromMongo")public JSONMessage removeFileFromMongo(String id, String filename, String collection, String contentType) {try {MongoFileOperationUtil.removeFile(id, filename, collection, contentType);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}return JSONMessage.success();}

MongoFileOperationUtil是自己封装的一个工具类:

@Component public class MongoFileOperationUtil {private static AdvancedDatastore dsForRW;private static final Logger log = LoggerFactory.getLogger(MongoFileOperationUtil.class);@Autowiredpublic void setDatastore(AdvancedDatastore dsForRW) {MongoFileOperationUtil.dsForRW = dsForRW;}public static void saveFile(File file, String id, String collection) {if (!file.exists()) {throw new ServiceException("文件没有找到");}try {// 连接数据库DB db = dsForRW.getDB();// 文件操作是在DB的基础上实现的,与表和文档没有关系GridFS gridFS = null;gridFS = new GridFS(db);GridFSInputFile mongofile = gridFS.createFile(file);// 添加属性if (id != null) {mongofile.put("_id", id);// 对应id}String filename=file.getName();if (filename != null) {mongofile.put("filename", filename);// 文件名称if (filename.lastIndexOf(".") > 0) {mongofile.put("contentType", filename.substring(filename.lastIndexOf(".") + 1));// 文件类型}}if (collection != null) {mongofile.put("collection", collection);// 所属集合}mongofile.save();// 保存} catch (Exception e) {e.printStackTrace();log.info("存储文件异常,id:" + id + ",所属集合:" + collection);}}public static void saveFile(byte[] data, String id, String filename, String collection) {if (data == null || data.length == 0) {throw new ServiceException("bytes不能为空");}try {// 连接数据库DB db = dsForRW.getDB();// 文件操作是在DB的基础上实现的,与表和文档没有关系GridFS gridFS = null;gridFS = new GridFS(db);GridFSInputFile mongofile = gridFS.createFile(data);// 添加属性if (id != null) {mongofile.put("_id", id);// 对应id}if (filename != null) {mongofile.put("filename", filename);// 文件名称if (filename.lastIndexOf(".") > 0) {mongofile.put("contentType", filename.substring(filename.lastIndexOf(".") + 1));// 文件类型}}if (collection != null) {mongofile.put("collection", collection);// 所属集合}mongofile.save();// 保存} catch (Exception e) {e.printStackTrace();log.info("存储文件异常,id:" + id + ",所属集合:" + collection);}}public static InputStream readFile(String id, String filename, String collection, String contentType)throws Exception {// 连接数据库DB db = dsForRW.getDB();GridFS gridFs = null;gridFs = new GridFS(db);// 查找条件DBObject query = new BasicDBObject();if (id != null) {query.put("_id", id);}if (filename != null) {query.put("filename", filename);}if (collection != null) {query.put("collection", collection);}if (contentType != null) {query.put("contentType", contentType);}// 查询的结果GridFSDBFile gridDBFile = gridFs.findOne(query);// 返回字节流return gridDBFile.getInputStream();}public static void removeFile(String id, String filename, String collection, String contentType) throws Exception {// 连接数据库DB db = dsForRW.getDB();GridFS gridFs = null;gridFs = new GridFS(db);// 查找条件DBObject query = new BasicDBObject();if (id != null) {query.put("_id", id);}if (filename != null) {query.put("filename", filename);}if (collection != null) {query.put("collection", collection);}if (contentType != null) {query.put("contentType", contentType);}gridFs.remove(query);}}


这里用Postman模拟上传文件的Post请求:


去Mongo里面查看(楼主这里用的是MongoBooster客户端):



根据查询参数,从Mongodb下载图片:



根据查询参数,删除Mongodb图片:



可以在Mongodb里面看到,代表文件的那一条数据已经被删除了:





1 0