在我目前的春季项目中,一些表单包含用户将图像文件上传到服务器的字段。但是,当我使用浏览器中的网络监视器(Firefox)检查哪些参数被发送到服务器时,我注意到文件上载字段未发送到服务器(仅列出常规字段)。
我只知道只有具有属性name
的字段被发送到服务器,并且我确保这些字段具有此属性。表单的html代码与此类似:
<form id="command" role="form" class="form" action="Categoria/cadastra" method="post" enctype="multipart/form-data">
<fieldset>
<div class="panel panel-default">
<div class="panel-heading">
</div>
<div class="panel-body">
<p>
<label for="nome" class="form-control">nome</label>
<input id="nome" name="nome" class="form-control" type="text" value=""/>
</p>
</div>
</div>
<div class="panel panel-default include">
<div class="panel-heading">
Selecione um arquivo de imagem para <i>capa da categoria</i>
</div>
<div class="panel-body">
<input type="file" name="file" class="form-control"/>
</div>
</div>
<p>
<button type="submit" class="btn btn-lg btn-primary">Cadastrar</button>
</p>
</fieldset>
</form>
请求由我的控制器中的此方法处理:
@RequestMapping(value="cadastra", method=RequestMethod.POST)
@ResponseBody
public String cadastrea(@ModelAttribute("object") E object, BindingResult result, @RequestParam(value="file", required=false) MultipartFile file) {
if(serv.cadastra(object)) {
if(serv.upload_picture(object, file))
return "yes";
else
return "data";
}
else {
return "not";
}
}
现在,我使用jquery脚本来处理向服务器发送请求的过程,接收响应并向用户显示一条消息,告诉处理结果。这是我正在使用的脚本:
$(document).on('submit', '.form', function (event) {
event.preventDefault();
var $form = $( this ), url = $form.attr( "action" );
var posting = $.post( url, $(this).serialize() );
posting.done(function( data ) {
var alert = $("#"+data);
alert.css("display", "block");
alert.fadeOut(2500);
$(".form").each(function(){
this.reset();
});
});
});
我被告知无法使用ajax调用发送类型file
的字段。这是真的?如果是,是否有其他方法在没有脚本的情况下执行相同的操作(从服务器捕获响应并在同一页面中显示消息而不是重定向到另一页)?
答案 0 :(得分:0)
查看jqueryform插件。我相信他们通过将上传的文件包装在隐藏的iframe中并使用ajaxSubmit函数传递它来解决这个问题。
的内容
$('#yourForm').ajaxSubmit({
type: 'POST',
url: 'yourUrl'
});
应该做的伎俩。在控制器中,您将看一下HttpContext.Current.Request.Files
并处理该集合中的项目。