ExtJS和Spring MVC文件上传失败

时间:2014-12-30 08:45:14

标签: java spring extjs

我正在尝试使用其他字段上传文件,但浏览器显示错误:

" HTTP状态400 - 客户端发送的请求在语法上不正确()。"

以下是我的Java代码:

@RequestMapping(value = "/save.do", method = RequestMethod.POST)
public @ResponseBody
void saveUser(
        @RequestBody SystemUser systemUser,
        @RequestParam("file") MultipartFile file,
        BindingResult result) {
    if (result.hasErrors()) {
        for (ObjectError error : result.getAllErrors()) {
            System.err.println("Error: " + error.getCode() + " - "
                    + error.getDefaultMessage());
        }
    }
    String fileName = file.getOriginalFilename();
    try {
        byte[] bytes = file.getBytes();

        // Creating the directory to store file
        String rootPath = System.getProperty("catalina.home");
        File dir = new File(rootPath + File.separator + "img");
        if (!dir.exists())
            dir.mkdirs();

        // Create the file on server
        File serverFile = new File(dir.getAbsolutePath() + File.separator
                + fileName);
        BufferedOutputStream stream = new BufferedOutputStream(
                new FileOutputStream(serverFile));
        stream.write(bytes);
        stream.close();
        systemUser.setImageFile(fileName);
        systemUserService.create(systemUser);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

这是我的JS代码:

userformAdd = Ext.create('Ext.window.Window',{
          alias   : 'widget.usersform',
          title   : 'Add User',
          id : 'add',
          width   : 350,
          layout  : 'fit',
          resizable: false,
          closeAction: 'hide',
          modal   : true,
          config  : {
            recordIndex : 0,
            action : ''
          },
          items   : [{
            xtype : 'form',
            layout: 'anchor',
            bodyStyle: {
              background: 'none',
              padding: '10px',
              border: '0'
            },
            defaults: {
              xtype : 'textfield',
              anchor: '100%'
            },
            items : [{
              name  : 'id',
              fieldLabel: 'ID'
            },{
              name: 'fullName',
              fieldLabel: 'Full Name'
            },{
              name: 'address1',
              fieldLabel: 'Address 1'
            },{
              name: 'address2',
              fieldLabel: 'Address 2'
            },{
              name: 'contact1',
              fieldLabel: 'Contact 1'
            },{
              name: 'contact2',
              fieldLabel: 'Contact 2'
             },{
                    xtype: 'fileuploadfield',
                    name: 'file',
                    fieldLabel: 'File',
                    labelWidth: 50,
                    msgTarget: 'side',
                    allowBlank: false,
                    anchor: '100%',
                    buttonText: 'Select a File...'
                }]
          }],
          buttons: [{
            text: 'OK',
            handler : function (btn){
                var values = btn.up('window').down('form').getForm();
                values.submit({
                    url: 'module/save.do',
                    success: function(fp, o) {
                        var grid = Ext.ComponentQuery.query('grid')[0];
                        grid.getStore().load();
                    }
                });
                    userformAdd.close();
                ;
            }
          },{
            text    : 'Reset',
            handler : function () { 
              this.up('window').down('form').getForm().reset(); 
            }
          },{
            text   : 'Cancel',
            handler: function () { 
              this.up('window').close();
            }
          }]
        });

我还在xml配置中将bean用于multipartResolver:

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- one of the properties available; the maximum file size in bytes -->
    <property name="maxUploadSize" value="5000000" />
</bean>

不确定我在这里做错了什么...任何建议/帮助都将不胜感激。 感谢

2 个答案:

答案 0 :(得分:0)

如果您要从saveUser返回void,则需要返回 ResponseStatus 来表示处理成功,并且您不需要ResponseBody

@RequestMapping(value = "/save.do", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK) 
public void saveUser(...)

如果你查看@ResponseBody的接口定义,你会发现它表明该方法应该返回一个值。

  

public @interface ResponseBody
  指示方法返回值的注释应绑定到Web响应主体。支持Servlet环境中带注释的处理程序方法。

您可能遇到的另一个问题是您声明值为SystemUser的@RequestBody参数要启用自动转换,您可以使用@EnableWebMvc或实现消息转换器。

以下是 Implement a MessageConveter

的示例

我看到的另一件事是您将控制器映射到/save.do并且您的JSON发布到/module/save.do

答案 1 :(得分:0)

在ExtJS表单中,您需要将fileUpload设置为true,方法POST