var xhr = $.ajaxSettings.xhr();
var headers = $.extend({
'Upload-Offset': range_from,
'Content-Type': 'application/offset+octet-stream'
}, self.options.headers);
var options = {
type: 'PATCH',
url: self.fileUrl, // 图片后缀地址例如:/api/v1/upload/upload_resumable/default/default.zopen.standalone/c/4/c/4a94af6df4522ab6f8023e8a7f0b9.jpg
data: blob,
processData: false,
contentType: self.file.type,
cache: false,
xhr: function() {
return xhr;
},
headers: headers
};
$(xhr.upload).bind('progress', function(e) {
self.bytesWritten = bytesWrittenAtStart + e.originalEvent.loaded;
self._emitProgress(e);
});
this._jqXHR = $.ajax(options)
.fail(function(jqXHR, textStatus, errorThrown) {
var msg = jqXHR.responseText || textStatus || errorThrown;
self._emitFail(msg);
})
.done(function() {
if(range_to === self.file.size){
if (self.options.resetAfter === true) {
self._urlCache(false);
}
self._emitDone();
}else{
self._uploadFile(range_to);
}
});
};
上面url参数是图片后缀地址,服务端获取的request method 变成了GET,如果url改成非图片后缀地址,request method是正常的。
测试type参数为POST也是相同问题。
问题总结:发起Ajax请求,如果请求地址是一个图片后缀地址,浏览器把请求方式统一变成了GET
ISO系统没问题,部分安卓机型有问题,有问题的钉钉版本和浏览器user agnet 如下:
'HTTP_USER_AGENT': 'Mozilla/5.0 (Linux; U; Android 9; zh-CN; BKL-AL00 Build/HUAWEIBKL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/11.9.4.974 UWS/2.13.1.52 Mobile Safari/537.36 AliApp(DingTalk/4.6.18) com.alibaba.android.rimet/11146596 Channel/227200 language/zh-CN',
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据你的描述,问题似乎出在特定的安卓设备和钉钉版本上,当Ajax请求的目标URL指向一个图片后缀时,这些环境下的浏览器会不遵循你设置的HTTP方法(在这里是PATCH
),而是将其错误地转换为GET
请求。这可能是由于某些特定浏览器或应用内浏览器(如钉钉内置浏览器)对URL结尾是图片格式的特殊处理逻辑导致的。
解决这个问题可能需要一些变通的方法,以下是一些建议:
修改请求路径:
使用代理服务:
检查并适配User-Agent:
navigator.userAgent
来识别出有问题的用户代理字符串。对于这些特定的用户代理,可以尝试调整请求策略,比如临时改变请求方式为POST(虽然你提到POST也有问题,但可以尝试结合其他规避措施)或者通过更改URL方案来绕过这一问题。利用表单提交模拟:
与钉钉团队沟通:
请根据实际情况选择合适的解决方案进行尝试。希望这些建议对你有所帮助!