grails将文件插入mongodb数据库

首先建立一个Domain class类。代码如下所示:

import com.mongodb.WriteConcern
import org.bson.types.ObjectId

class FileItem {

    static mapWith = "mongo"
    static constraints = {
    }
    static mapping = {
        writeConcern WriteConcern.FSYNC_SAFE
    }

    ObjectId id
    String fileName         //文件名
    String fileType         //文件类型
    Long fileSize           //文件大小
    String fileDescription  //文件描述
    String fsId             //FSGrid存储ID

    Date dateCreated //创建日期
    Date lastUpdated //最后修改日期
    String createdBy //创建人
    String updatedBy //最后修改人
}

接下来需要一个公共类,将任何类型的本地文件都可以自动存入到数据库中去。

Service类如下所示:

import com.mongodb.gridfs.GridFS
import com.mongodb.gridfs.GridFSDBFile
import com.mongodb.gridfs.GridFSInputFile
import org.bson.types.ObjectId

/**
 * 文件管理服务
 * 通过Mongo GRIDFS 服务提供文件的存储
 * 通过FileItem表记录真实文件名与GRID FS ID的关联
 */
class FileMgmtService {

    static transactional = false
    def mongo
    def grailsApplication
    def securityService

    /**
     * 上传文件保存到集中存储的地方
     * @return
     */

    FileItem saveFile(String fileName, byte[] fileData, String contentType, String fileDescription) {

        //存储GridFS数据库
        GridFS gridFS = new GridFS(mongo.getDB(grailsApplication.config.grails.mongo.databaseName))

        GridFSInputFile gridFSInputFile = gridFS.createFile(fileData)
        gridFSInputFile.filename = fileName
        gridFSInputFile.contentType = contentType
        gridFSInputFile.save()

        //存储FileItem表
        FileItem fileItem = new FileItem()
        fileItem.fileDescription = fileDescription
        fileItem.fileName = fileName
        fileItem.createdBy = securityService.currentUserName
        fileItem.dateCreated = new Date()
        fileItem.fileSize = fileData.size()
        fileItem.fileType = contentType
        fileItem.fsId = gridFSInputFile.id.toString()
        fileItem.save(flush: true, validate: false)

        return fileItem
    }

    //删除文件必须通过该服务,同时删除FileItem和GridFS文件
    void deleteFile(String fileItemId) {
        FileItem fileItem = FileItem.findById(new ObjectId(fileItemId))

        if(fileItem){
            GridFS gridFS = new GridFS(mongo.getDB(grailsApplication.config.grails.mongo.databaseName))
            gridFS.remove(new ObjectId(fileItem.fsId))
            fileItem.delete()
        }
    }

    //获取真正文件数据
    byte[] getFileData(String fileItemId) {
        FileItem fileItem = FileItem.findById(new ObjectId(fileItemId))

        if(fileItem){
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()
            GridFS gridFS = new GridFS(mongo.getDB(grailsApplication.config.grails.mongo.databaseName))
            GridFSDBFile gridFSDBFile = gridFS.find(new ObjectId(fileItem.fsId))
            if(gridFSDBFile){
                gridFSDBFile.writeTo(byteArrayOutputStream)
            }
            return byteArrayOutputStream.toByteArray()
        }else{
            return null
        }

    }

}

读取数据库中如果有国际化文件,则必须读取环境中相应的语言类型,然后进行选择。

def getCurrentLocale() {
        try {
            def lang = RequestContextHolder.currentRequestAttributes().getSession().'org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE'.language
            if (lang) {
                if (lang.startsWith('en')) {
                    return ParameterConstant.LOCALE_EN_US
                }  else if (lang && lang.startsWith('zh')) {
                    return ParameterConstant.LOCALE_ZH_CN
                }
            } else {
                return ParameterConstant.LOCALE_EN_US
            }
        } catch (Throwable e) {
            return ParameterConstant.LOCALE_EN_US
        }
    }


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值