Extjs:使用提交表单上传文件

时间:2014-08-01 13:27:21

标签: javascript spring extjs file-upload multipart

我正在尝试使用ExtJs和Spring上传文件(excel)而没有运气,所以我希望你能帮助我。在面板中我有一个按钮(fileuploadfield),我选择了一个文件,我想上传。

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

},
.
.

这是我的控制器。每次我用fileuploadfield选择文件时,它都会激活函数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

我认为问题出在我的客户端请求中。我认为我的请求没有附加我要上传的文件。我试图在客户端将Headers设置为undefined,但随后内容类型变为“application / json”,我得到的错误是请求不是multipart。那我的代码出了什么问题?我真的希望有人帮我解决这个问题。提前谢谢!

更新

感谢@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,并且发生了同样的错误。

1 个答案:

答案 0 :(得分:0)

问题是您在上传功能中创建了一个新表单。您可以提交新的空表单,而不是提交包含文件上传按钮的表单。

首先,您必须确保文件上传按钮位于表单内。然后你必须提交该表格。

在更改处理程序中,在此行添加fld:

me.uploadFile(fld);

将URL设置为表单的属性,并将uploadFile简化为:

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

顺便说一句,记录(在record.data.resource中)没有定义,似乎你的代码不完整或者它不起作用。