Extjs: загрузить файл с формой отправки

Я безуспешно пытаюсь загрузить файл (excel) с помощью ExtJs и Spring, поэтому надеюсь, что вы мне поможете. На панели у меня есть кнопка (поле загрузки файла), и с ее помощью я выбираю файл, который хочу загрузить.

.
.
,{
    xtype: 'fileuploadfield',
    buttonOnly: true,
    hideLabel: true,
    buttonText: "Importuoti excel failą",
    border: false,
    itemId: "uploadBtn",
    name: 'file'

},
.
.

Это мой контроллер. Каждый раз, когда я выбираю файл с полем загрузки файла, он активирует функцию uploadFile ().

init: function() {
    var me = this;
    this.listen({
        '#uploadBtn': {
                'change': function(fld, value) {
                    console.log(value);
                    this.getTurtasPanel().setLoading(true, true);
                    if(value != ""){
                        me.uploadFile();
                        fld.reset();
                    }

                }
            },
})

Функция uploadFile.

uploadFile: function(){
    var fp = Ext.create('Ext.form.Panel', {
        fileUpload: true,
        autoHeight: true,
        bodyStyle: 'padding: 10px 10px 0 10px;',
        labelWidth: 50,
        method: 'POST',
        defaults: {
            anchor: '95%',
            allowBlank: false,
            msgTarget: 'side'
        }
    })
    if(fp.getForm().isValid()){
        fp.getForm().submit({
            url: Turtas.Properties.getServicePath()+'/save/' + record.data.resource,
            headers: {'Content-Type':'multipart/form-data; charset=UTF-8'},
        })
    }

},

И контроллер Spring:

@RequestMapping(value="turtas/save/gelezinkeliai", method=RequestMethod.POST)
    public @ResponseBody void saveGelezinkeliaiFromExcel(@RequestParam("file") MultipartFile file){
    System.out.println(file);
}

И ошибка, которую я получаю:

Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found

the request was rejected because no multipart boundary was found

Я думаю, проблема в моем запросе на стороне клиента. Я думаю, что мой запрос не прикрепляет файл, который я хочу загрузить. Я попытался установить заголовки на стороне клиента как undefined, но затем тип содержимого становится «application / json», и я получаю сообщение об ошибке, что запрос не является составным. Так что не так с моим кодом? Очень надеюсь, что кто-нибудь поможет мне разобраться в этой проблеме. Заранее спасибо !

Обновить

Спасибо @Lorenz Meyer за ответ, но теперь у меня другая ошибка:

java.lang.IllegalArgumentException: ваш InputStream не был ни потоком OLE2, ни потоком OOXML

я немного изменил свой исходный код.

 @RequestMapping(value="turtas/save/gelezinkeliai", method=RequestMethod.POST)
    public @ResponseBody void saveGelezinkeliaiFromExcel(@RequestParam("file") MultipartFile file){
    System.out.println(file.getContentType());
    System.out.println(file.getSize());
    System.out.println(file.getName());
    System.out.println(file.getOriginalFilename());
    System.out.println(file.isEmpty());
}

Вывод:

application/octet-stream
0
file

true

Со стороны клиента я не включаю параметры, а со стороны сервера я запрашиваю один параметр (параметр файла), возможно, это проблема. Ошибка говорит, что я выбираю файлы плохого формата, хотя я выбираю .xlsx или .xls, и возникает та же ошибка.


person Egizeris    schedule 01.08.2014    source источник


Ответы (1)


Проблема в том, что вы создаете новую форму в своей функции загрузки. Вместо отправки формы, содержащей кнопку загрузки файла, вы отправляете новую пустую форму.

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

В обработчике изменений добавьте поле в эту строку:

me.uploadFile(fld);

Задайте URL-адрес как свойство формы и упростите uploadFile до:

uploadFile: function(fld){
    var form = fld.up('form').getForm()
    if(form.isValid()) form.submit()
}

Кстати, запись (в record.data.resource) не определена, и кажется, что ваш код не завершен или не будет работать.

person Lorenz Meyer    schedule 02.08.2014
comment
Извините, я не говорю на Java. - person Lorenz Meyer; 04.08.2014
comment
Попробуйте @RequestPart. Также обратите внимание на заголовки ваших запросов: у вас должно быть что-то вроде Content-Type: multipart / form-data; border = .... Spring, кажется, жалуется на то, что в заголовке нет установленных границ. - person Mike; 06.09.2014