Загрузка файла в Grails
Я пытаюсь загрузить файл в Grails в моем GSP у меня есть:
<g:form id="update" url="[action: 'updateStatus',]">
<g:textArea name="message" value="" cols="3" rows="1"/><br/>
<g:textField id="tagField" name="tag" value=""/><br/>
<input id="inputField" type="file" name="myFile" enctype="multipart/form-data" />
<g:submitButton name="Update Status"/>
</g:form>
В моем контроллере у меня есть:
def updateStatus(String message) {
if (params.myFile){
def f = request.getFile('myFile')
}
Файл запроса get не выполняется с этой ошибкой:
No signature of method: org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper.getFile() is applicable for argument types: (java.lang.String) values: [myFile]
Любые идеи, почему это так, как я и использую getFile в других моих контроллерах, который работает нормально.
3 ответа
Вот рабочий файл отправки:
форма (gsp)
<form method="post" enctype="multipart/form-data">
<p><input type='file' name="cfile"/></p>
<input type='submit'>
</form>
контроллер, который будет хранить отправленный файл в 'D:/submit_file':
def index() {
if(params.cfile){
if(params.cfile instanceof org.springframework.web.multipart.commons.CommonsMultipartFile){
new FileOutputStream('d:/submitted_file').leftShift( params.cfile.getInputStream() );
//params.cfile.transferTo(new File('D:/submitted_file'));
}else{
log.error("wrong attachment type [${cfile.getClass()}]");
}
}
}
это работает для меня (Grails 2.0.4)
Тебе нужно enctype="multipart/form-data"
на g:form
тег, чтобы браузер использовал многочастный запрос.
Чтобы загрузить файл, вы должны указать в форме энктип. Для этого вы можете использовать <g:uploadForm>
который идентичен стандартному тегу формы, за исключением того, что он автоматически устанавливает атрибут enctype в "multipart / form-data".
Я предпочитаю использовать плагин Grails Selfie и плагин загрузки изображений / файлов, чтобы прикреплять файлы к моделям вашего домена, загружать их в CDN, проверять содержимое или создавать эскизы.
Домен
import com.bertramlabs.plugins.selfie.Attachment
class Book {
String name
Attachment photo
static attachmentOptions = [
photo: [
styles: [
thumb: [width: 50, height: 50, mode: 'fit'],
medium: [width: 250, height: 250, mode: 'scale']
]
]
]
static embedded = ['photo'] //required
static constraints = {
photo contentType: ['image/jpeg','image/png'], fileSize:1024*1024 // 1mb
}
}
GSP
<g:uploadForm name="myUpload" controller="upload" action="updateStatus">
<input type="file" name="myFile" />
</g:uploadForm>
контроллер
class PhotoController {
def upload() {
def photo = new Photo(params)
if(!photo.save()) {
println "Error Saving! ${photo.errors.allErrors}"
}
redirect view: "index"
}
}
источники