You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XMLHttpRequest上传文件至Servlet/JSP仅传路径,请求排查错误

问题排查:XMLHttpRequest上传文件仅发送路径而非文件内容

先帮你梳理下代码里的问题,以及对应的解决方向:

1. 修复状态判断的拼写错误

你的onreadystatechange回调里,状态判断写错了:xhr.readystate应该是**xhr.readyState**(首字母大写)。这个错误会导致你永远无法触发"succes"提示,哪怕文件上传成功,也会走到else分支弹出"error",严重干扰你判断实际的上传结果。修改后这部分代码应该是:

xhr.onreadystatechange = function(){
    if(xhr.readyState == 4 && xhr.status == 200) {
        alert("succes");
        //location.reload();
    } else if(xhr.readyState == 4){
        alert("error");
    }
};

(额外优化:只在readyState == 4时才判断状态,避免请求中途触发错误提示)

2. 确认FormData的键名与服务器端期望一致

你现在用dataFile.append('file', jQuery("#test")[0].files[0]);添加文件,但服务器端的Servlet/JSP是根据参数名来获取上传文件的。如果原JSP表单里的文件输入框name属性不是file(比如原表单里是<input type="file" id="test" name="excelFile">),服务器端就找不到你上传的文件,反而可能因为兼容问题接收到浏览器隐藏真实路径后的假路径(c:\fakepath\xork.xls)。

你需要查看原JSP表单中文件输入框的name值,然后把FormData的键名改成和它一致。比如原输入框name是test,就改成:

dataFile.append('test', jQuery("#test")[0].files[0]);

3. 其他注意点

  • 你注释掉xhr.setRequestHeader('Content-Type', 'multipart/form-data');是完全正确的:当使用FormData发送请求时,浏览器会自动生成包含正确边界符的Content-Type头,手动设置反而会破坏这一机制,导致服务器无法解析multipart请求。
  • 确保你的浏览器支持FormData和XMLHttpRequest的文件上传功能(IE10及以上、所有现代浏览器都支持)。
  • 可以去掉请求URL末尾多余的问号:contextPath+'/followup/addBarcodeToListEPC.do'即可,问号不影响功能,但没必要保留。

按照上面的步骤修改后,应该就能正确上传文件而不是仅发送路径了。

内容的提问来源于stack exchange,提问作者Antoine Godeau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:52:53