如何保存到Grails中的文件系统目录

How to save to a file system directory in Grails

我正在尝试将上传的文件保存到文件系统目录中,并允许其他用户下载。

我目前将其保存在我的数据库中,而不是我的文件系统目录中。这是我的代码:

class Document {
    String filename
    byte[] filedata           
    Date uploadDate = new Date()

    static constraints = {
        filename(blank: false, nullable:false)
        filedata(blank: true, nullable: true, maxSize:1073741824)
    }
}

我上传文件的控制器是:

class DocumentController {

    static allowedMethods = [delete: "POST"]

    def index = {
        redirect(action: "list", params: params)
    }

    def list() {
        params.max = 10
        [documentInstanceList: Document.list(params), documentInstanceTotal: Document.count()]
    }

    def uploadPage() {

    }

    def upload() {
        def file = request.getFile('file')
        if(file.isEmpty())
        {
            flash.message = "File cannot be empty"
        }
        else
        {
            def documentInstance = new Document()
            documentInstance.filename = file.getOriginalFilename()
            documentInstance.filedata = file.getBytes()
            documentInstance.save()    
        }
        redirect (action: 'list')
    }
}

我想你可以做一个类似于下面的功能:

boolean upload(MultipartFile uploadFile, String fileUploadDir){
    String uploadDir = !fileUploadDir.equals('') ?: 'C:/temp' //You define the path where the file will be saved
    File newFile = new File("$uploadDir/${uploadFile.originalFilename}"); //You create the destination file
    uploadFile.transferTo(newFile); //Transfer the data

    /**You would need to create an independent Domain where to store the path of the file or have the path directly in your domain*/

}

由于您只需要保存文件的路径,您可以在域中添加一个字符串来存储它,或者您可以创建一个独立的域来存储文件的数据。您还需要在需要的地方添加 try/catch 语句。

要检索文件,您需要向控制器添加如下代码:

File  downloadFile = new File(yourFileDomain?.pathProperty) //get the file using the data you saved in your domain
if(downloadFile){ //Set your response properties
            response.characterEncoding = "UTF-8"
            response.setHeader "Content-disposition", "attachment; filename=\"${yourFileDomain?.fileNameProperty}\"" //add the header with the filename you saved in your domain you could also set a default filename
            //response.setHeader "Content-disposition", "attachment; filename=\"myfile.txt\""
            response.outputStream << new FileInputStream(downloadFile) 
            response.outputStream.flush()
            return
        }

希望对您有所帮助,欢迎大家提出意见。