我正在测试SAP Leonardo图像特征提取API(https://sandbox.api.sap.com/ml/featureextraction/inference_sync)。我有图像的base64字符串,我想将其转换为文件对象并压缩,然后使用XMLHttpRequest将压缩后的图像文件发送到这个API。但响应文本是“服务需要一组(压缩的)图像”。
我附上了我的HTTP请求头和参数的截图如下。
尽管我们在参数中看到乱码,但压缩文件在这里下载已成功创建。
如果您无法下载压缩文件,请参考下面的截图。
一切看起来都没问题。然而,响应文本如下,状态为400。
我的JavaScript代码如下。哪里出了问题?这让我快疯了…
dataURItoBlob: function(dataURI, fileName) { //将base64/URL编码的数据组件转换为字符串中保存的原始二进制数据 var byteString; if (dataURI.split(',')[0].indexOf('base64') >= 0) byteString = atob(dataURI.split(',')[1]); else byteString = unescape(dataURI.split(',')[1]); //分离出mime组件 var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; //将字符串的字节写入类型化数组 var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } var blob = new Blob([ia], {encoding:"UTF-8",type:mimeString}); //Blob()几乎是File() - 它只是缺少下面两个属性,我们将添加这些属性 blob.lastModifiedDate = new Date(); blob.name = fileName + '.' + mimeString.split('/')[1]; return blob;},onSubmit: function(oEvent) { var oImage = this.getView().byId('myImage'); //oImage.getSrc() : 'data:image/png;base64,iVBORw0KGgo...' var imageFile = this.dataURItoBlob(oImage.getSrc(), 'myImage'); var zip = new JSZip(); zip.file(imageFile.name, imageFile); zip.generateAsync({ type:"blob", compression: 'DEFLATE', // 强制对这个文件进行压缩 compressionOptions: { level: 6, }, }).then(function(content) { //saveAs(content, "hello.zip"); // 启动忙碌指示器 var oBusyIndicator = new sap.m.BusyDialog(); oBusyIndicator.open(); var formData = new FormData(); formData.append('files', content, 'myImage.zip'); var xhr = new XMLHttpRequest(); xhr.withCredentials = false; xhr.addEventListener("readystatechange", function () { if (this.readyState === this.DONE) { oBusyIndicator.close(); //navigator.notification.alert(this.responseText); console.log(this.responseText); } }); //设置请求方法 //API沙箱的API端点 //在HCP中配置的Destionation '/SANDBOX_API'为'https://sandbox.api.sap.com' var api = "/SANDBOX_API/ml/featureextraction/inference_sync"; xhr.open("POST", api); //添加请求头 xhr.setRequestHeader("Content-Type", "multipart/form-data"); xhr.setRequestHeader("Accept", "application/json"); //API沙箱的API密钥 xhr.setRequestHeader("APIKey", "yQd5Oy785NkAIob6g1eNwctBg4m1LGQS"); //发送请求 xhr.send(formData); }); },
回答:
我自己解决了这个问题。我分享我的解决方案只是为了其他人的参考。解决方法非常简单,只需在发送请求前删除下面的代码即可。我不知道为什么这样做。请如果您知道原因,提供建议。提前感谢!
xhr.setRequestHeader("Content-Type", "multipart/form-data");
此致,[隐藏人名]