用ajax上传文件的若干问题,老是报:Posted content type isn't multipart/form-data

用ajax上传文件的若干问题,老是报:Posted content type isn't multipart/form-data。参考网上若干文章:比如http://harttle.com/2016/07/04/jquery-file-upload.html  等,进行若干尝试,按理应该是可以上传成功的吧?是否是我又说忽视?

页面代码(有点乱,别介意哈):

<html>
<head>
<title>测试</title>
<script type="text/javascript" src="/js/jquery-1.4.4.min.js"></script>
<script type="text/javascript">
$(function(){
	$("#btn").click(function() {
		//var form = new FormData(document.getElementById("form1"));
		/* var formData = $(document.getElementById("form1")).serialize();
		$.ajax({
		    url: "/test/upload",
		    type: "post",
		    data: formData,
		    async: false,
	        cache: false,
	        contentType: false,
	        processData: false,
	        headers: {'Content-Type': 'multipart/form-data'},
		    success:function(data){
		        console.log("over..");
		    },
		    error:function(e){
		        alert("错误!!");
		    }
		});  */
		
		/* var formData = new FormData();
		formData.append('file', $('#file')[0].files[0]); */
		
		/* $.ajax({
		    url: '/test/upload',
		    type: 'POST',
		    cache: false,
		    data: new FormData($('#form1')[0]),
		    processData: false,
		    contentType: false
		}).done(function(res) {
		}).fail(function(res) {}); */
		
		
		 var files = $('#avatar').get(0).files;

		  var data = new FormData();
		  data.append('file', files[0]);

		  $.ajax({
		      url: '/test/upload',
		      type: 'POST',
		      data: data,
		      cache: false,
		      processData: false,
		      contentType: false
		  });
		
	});
});
</script>
</head>

<body>
<h1>测试测试测试</h1>

<div class="table_box">
	<br><br><br>
	<!-- <form id="form1" action="/test/upload" method="post" enctype="multipart/form-data" > -->
	<!-- <form id="form1"  enctype="multipart/form-data"> -->
        <!-- <input type="file" id="file" name="file"></input>
         <input type="text" id="aa" name="h1"></input>
          <input type="text" id="bb" name="h2"></input>
        <input type="button" onclick="" id="btn" value="上传"> -->
     <!-- </form> -->
     
     <form>
	  <input type="file" id="avatar" name="avatar" multiple>
	  <input type="button" id="btn" value="上传">
	</form>
     
	<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
	<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
</div>

</body>
</html>


后台代码:

  public void upload(){
		UploadFile file = getFile("file", "\\");
		System.out.println(getPara("h1"));
		System.out.println(getPara("h2"));
		System.out.println(file.getUploadPath()+""+file.getFileName()+""+file.getOriginalFileName());
		renderJson(Tools.getResult(200));
	}


尝试了网上N种ajax上传,然后用jfinal来处理,结果大多都是报Posted content type isn't multipart/form-data,还有一次是报 分界不明确。没有用别的框架试过,但是按道理网上那么多种方法总有一种能行的吧,结果每一种能OK?!是否是我忽视了什么鬼?求指出指出指出!!!



评论区

JFinal

2016-10-18 11:40

别折腾得这么麻烦,直接下载本站的 jquery form 文件:http://www.jfinal.com/assets/jquery_form/jquery.form.min.js 然后用下面几行代码搞定:
$(document).ready(function() {
$("#myArticleForm").ajaxForm({
dataType: "json"
, success: function(ret) {}
, error: function(ret) {}
});
});

这行代码的两个关键点注意一下:
1:注意页面 form 表单的 id 属性为:myArticleForm,这个可以改,注意对上js中的选择器使用的名称就好,也可以使用别的选择器
2:注意页面 form 表单需要设置 method 与 enctype 属性: method="POST" enctype="multipart/form-data"

JFinal

2016-10-18 11:57

3:注意页面 form 表单的提交按钮的 typ 类型是常规的 submit:type="submit"

jquery form 这个工具的关键功能就是:页面要提交的表单,按照常规的非 ajax 的方式去组织,例如提交铵钮是 submit 而不是 button 类型,然后 jquery form 通过 $(...).ajaxForm(...) 这行代码可以接管提交这个动作,将你的普通表单提交直接改变成 ajax 提交

jquery form 的核心价值在于将你的普通表单提交自动转化成 ajax 提交

sruz

2016-10-18 13:32

@JFinal 感谢波哥哈,,,再去试试看奥

simon1991

2016-10-20 12:17

@xRhbN 成功了吗?贴代码出来看看呀

sruz

2016-10-20 14:20

@simon1991 反正form表单是肯定能成功的,至于jquery form我就没试了,项目有点赶进度,这个问题就留到接口对接的时候,,留给前端去思考了

simon1991

2016-10-20 16:07

@JFinal
/*jsp代码块*/



/*js代码块*/
function submitexcelFile()
{
alert("开始");
console.log($("#uploadexcel"));
$("#uploadexcel").ajaxForm({
url: "${base}/common/fileUpload",
type: "post",
dataType:'json',
success: function (data)
{
alert(data.errMsg);
},
error: function (data)
{
alert("出错");
},
complete:function(data){
alert("complete");
}
});
alert("结束");
}



这个弹出了开始,最后也弹出了"结束",但是没有报错,也没有网络请求,后台断点当然也不会进了,也就是说ajaxForm没有执行成功,请问是什么问题呢

simon1991

2016-10-20 16:07

JFinal

2016-10-20 16:40

@simon1991 注意我第一个回复的两个关键点

欣绶敛暧

2016-12-06 09:42

后面加一行代码 alert("结束");后加上 $("#uploadexcel").submit();

1120yun

2017-05-06 16:58

@JFinal如您第一个回复的两个关键点,要求是必须是一个form,也就是说文件上传的时候需要提交另一个用隐藏域隐藏的表单,是这个意思吗?

Frankie1

2017-07-19 17:59

成功了 谢谢大佬

小风

2017-08-29 15:47

解决了吗 遇到 一样的问题了

sruz

2017-09-07 15:06

@小风 你试试 波总 回复 的 方案, 我也 忘记 当时 怎么 弄得 了,,反正 最不济 就是 用 浏览器开发者 工具 关注 发送的 数据,用 拦截器 拦截 接收到 的 数据,以此 对比,,分析 问题,,,还可以 关注 源码

花开不败

2017-10-10 11:32

@JFinal 为什么我的还是不对呢
@JFinal Posted content type isn't multipart/form-data

小周子

2017-10-25 10:34

@JFinal 提供的解决方案是正确的通过他的提供我解决了,代码如下:

$(document).ready(function() {
$("#formLogin").ajaxForm({
dataType: "json"
, success: function(data) {
console.log("成功",data)
}
, error: function(ret) {
console.log("错误")
}
});
});

小周子

2017-10-25 10:35

需要加入一个script src="http://www.jfinal.com/assets/jquery_form/jquery.form.min.js "

JFinal

2017-10-25 10:50

@小周子 jquery form 是极其好用的,它的最大的好处是你的 form 表单完全按常规方式去组织,心中没有 ajax 什么事情,而后用 jquery form 的一个 ajaxForm 方法来发起 ajax 请求

相当于将普通请求自动接管,并自动转换成 ajax 请求,非常省心,本站所有数据提交全用的这种方式

zhangshiqiang

2017-10-31 10:31

ajaxform 其实是把文件上传到一个隐藏的iframe中。服务端的响应内容也在iframe中。

sunwenke

2017-11-12 12:06

@JFinal 请求地址是写在ajax上还是form表单的action上

君凰雪靈

2017-11-24 16:08

不是form-data提交怎么获取input文件信息啊

JFinal

2017-11-24 16:36

@sunwenke 如果用 jquery form , 是写天 form 表单的 action 上, 相当于表单一切照旧,只是用 jquery form 接管提交并变为 ajax 而已

xupengjifnal

2018-02-27 17:06

@JFinal 我用ajaxForm提交后成功了,为什么返回前台时success不执行呢?error也不执行,怎么回事?

dozer

2018-03-20 08:42

@JFinal jquery如何验证 是否已经选择文件呢

汪鹏飞

2018-04-24 12:22

@欣绶敛暧 这个说的对

belide

2018-11-10 11:22

@JFinal Uncaught TypeError: $(...).ajaxForm is not a function

热门反馈

扫码入社