Grails скачать файл - PullRequest
       0

Grails скачать файл

7 голосов
/ 24 мая 2011

Я использовал этот метод, чтобы скопировать файл в папку в моем проекте (первый метод), и я отредактировал его так, чтобы местоположение сохранялось в моем 'Location' в классе Submissions (см.ниже).

Теперь я хочу иметь возможность, после нажатия на изображение в моем представлении, загрузить этот файл.Как я могу это сделать?

class Submissions {

    Date dateSub
    String Location
    String fileName

}

Ответы [ 4 ]

22 голосов
/ 24 мая 2011

Я сделал что-то похожее на следующее:

Предполагая, что ваша страница загрузки имеет соответствующий экземпляр Submissions ...

<g:link action="downloadFile" id="${aSubmission.id}">
    <img>...etc...</img>
</g:link>

Затем в контроллере (это ваше "местоположение" путь кфайл?):

def downloadFile = {
    def sub = Submissions.get(params.id)
    def file = new File("${sub.location}/${sub.fileName")
    if (file.exists())
    {
        response.setContentType("application/octet-stream") // or or image/JPEG or text/xml or whatever type the file is
        response.setHeader("Content-disposition", "attachment;filename=\"${file.name}\"")
        response.outputStream << file.bytes
    }
    else render "Error!" // appropriate error handling
}
3 голосов
/ 27 марта 2014

Что ж, всегда лучше хранить логику загрузки внутри try / catch, а также устанавливать для веб-запроса значение falsehttp://lalitagarw.blogspot.in/2014/03/grails-forcing-file-download.html

def downloadFile() {
    InputStream contentStream
    try {
        def file = new File("<path>")  
        response.setHeader "Content-disposition", "attachment; filename=filename-with-extension"
        response.setHeader("Content-Length", "file-size")
        response.setContentType("file-mime-type")
        contentStream = file.newInputStream()
        response.outputStream << contentStream
        webRequest.renderView = false
    } finally {
        IOUtils.closeQuietly(contentStream)
    }
}
1 голос
/ 24 мая 2011

Я использовал редактор FCKEditor WYSIWYG http://www.grails.org/plugin/fckeditor, это также простой в использовании загрузчик файлов.

1 голос
/ 24 мая 2011

вам просто нужно визуализировать байты в ответе. Мы делаем что-то вроде

def streamFile = {
    // load the attachment by id passed on params
    ....
    response.contentType = attachment.contentType.toLowerCase()
    response.contentLength = attachment.data.length()
    // our 'data' field is a Blob, the important thing here is to get the bytes according to
    // how you get the actual downlaod
    response.outputStream.write(attachment.data.getBytes(1L, attachment.data?.length() as int))
}

в нашем контроллере, и просто создайте ссылку на этот метод контроллера на gsp. В зависимости от того, как вы выбираете тип контента, браузер сделает все за вас. Если у вас есть тип изображения, например, он покажет изображение. Если у вас есть текстовый документ, браузер должен открыть соответствующую программу для системы пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...