2014-12-30 49 views
0

我想上傳與其它字段文件,但瀏覽器顯示的錯誤:「HTTP狀態400 - 客戶端發送的請求是語法不正確的()」ExtJS的和Spring MVC文件上傳失敗

這裏是我的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(); 
      } 
      }] 
     }); 

而且我還用於multipartResolver豆在xml配置:

<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> 

不知道我在做什麼錯在這裏...任何建議/幫助將不勝感激。 感謝

回答

0

如果你打算從saveUser返回void需要返回ResponseStatus信號成功處理,你不需要ResponseBody

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

如果您查看@ResponseBody的接口定義,您將看到它指示該方法應該返回一個值。

public @interface ResponseBody
Annotation that indicates a method return value should be bound to the web response body. Supported for annotated handler methods in Servlet environments.

你可能有另一個問題是,你是聲明一個@RequestBody參數與SystemUser一個值要啓用自動轉換可以使用@EnableWebMvc或實現消息變換器..

下面是一個例子你怎麼能Implement a MessageConveter

另一件事我看到犯罪嫌疑人的是,你有你的控制器映射到/save.do和你的JSON被張貼到/module/save.do

+0

HTTP本身存在問題(錯誤400)......它沒有解決問題:( –

+0

請再次嘗試使用方法聲明我提供。 @ResponseBody指出,'返回一個值',但你有一個'void'定義。 –

+0

我宣佈了註釋,因爲您提供並刪除了@ResponseBody,但問題仍然是一樣的... –

0

在您的ExtJS窗體中,您需要將fileUpload設置爲true並且方法POST