我正在尝试使用其他字段上传文件,但浏览器显示错误:
" 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>
不确定我在这里做错了什么...任何建议/帮助都将不胜感激。 感谢
答案 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