当前位置:

mongoDB 使用 GridFsTemplate 存储文件

机器助手 |  2025-07-13
 71人浏览


/**
 * @author hujunbo
 * @date 2023/2/7
 */

@Component
public class MongoFileStorageDao implements FileStorageDao {




    @Autowired
    private GridFsTemplate gridFsTemplate;

    @Resource
    private FilePropertiesConfig filePropertiesConfig;


    @Override
    public InputStream getFileInputStream(FileInfo mongoFileInfo) {
        if(ObjectUtils.isEmpty(mongoFileInfo) || StringUtils.isBlank(mongoFileInfo.getFileId())){
            return null;
        }
        return getFileInputStream(mongoFileInfo.getFileId());
    }

    @Override
    public String getDownloadUrl(String fileId) {
        return  filePropertiesConfig.getDomain()  + filePropertiesConfig.getPrefix() + "/download/" + fileId;
    }

    @Override
    public String getPreviewUrl(String fileId) {
        return  filePropertiesConfig.getDomain()  + filePropertiesConfig.getPrefix() +  "/preview/" + fileId;
    }

    @Override
    public Integer deleteFileById(String fileId) {
        this.deleteFile(fileId);
        return 1;
    }


    public String store(String fileName, File file) throws Exception {
        return gridFsTemplate.store(new FileInputStream(file), fileName).toString();
    }
    public String store(String fileName,InputStream inputStream){
        return gridFsTemplate.store(inputStream, fileName).toString();
    }

    public GridFSFile find(ObjectId objectId) {
        return gridFsTemplate.findOne(Query.query(Criteria.where(DomainFieldConstants.ID).is(objectId)));
    }

    public void deleteFile(String fileId){
        gridFsTemplate.delete(Query.query(Criteria.where(DomainFieldConstants.ID).is(fileId)));
    }

    public GridFSFile find(String id) {
        return find(new ObjectId(id));
    }

    public InputStream getFileInputStream(String fileId) {
        GridFsResource resource = gridFsTemplate.getResource(find(fileId));
        InputStream inputStream = null;
        try {
            inputStream = resource.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return inputStream;
    }

    public File getFile(String id) {
        GridFSFile gridFSFile = find(new ObjectId(id));
        GridFsResource resource = gridFsTemplate.getResource(gridFSFile);
        try {
            return resource.getFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        InputStream inputStream = null;
        File file = new File(getAbsoluteFile(gridFSFile.getFilename()));
        FileOutputStream fileOutputStream = null;
        try {
            inputStream = resource.getInputStream();
            fileOutputStream = new FileOutputStream(getAbsoluteFile(gridFSFile.getFilename()));
            byte[] bytes = new byte[1024];
            while (inputStream.read(bytes) > 0) {
                fileOutputStream.write(bytes);
            }
            fileOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            file.delete();
            IoUtil.close(inputStream);
            IoUtil.close(fileOutputStream);
        }
        return file;
    }


    private String getAbsoluteFile(String filename) {
        String downloadPath = filePropertiesConfig.getPath() + filename;
        File desc = new File(downloadPath);
        if(!desc.getParentFile().exists()){
            desc.getParentFile().mkdirs();
        }
        return  downloadPath;
    }


    public FileInfo upload(FileInfo fileInfo, InputStream inputStream) {
        if (ObjectUtils.isEmpty(fileInfo)) {
            return null;
        }

        try {
            String fileId = this.store(fileInfo.getFileName(), inputStream);
            fileInfo.setFileId(fileId);
        }finally {
            IoUtil.close(inputStream);
        }

        return fileInfo;
    }
}

 

文章评论