Firebase Storage v3返回“多部分体”,不包含2个或3个部分.在Android 4.2.2和4.3上
Firebase Storage v3 returning "multipart body does not contain 2 or 3 parts" on Android 4.2.2 and 4.3
我正在构建一个Ionic应用程序,部署在Android 5和4上。当我尝试使用Firebase v3存储ref(使用Firebase .js API)来保存Android 4.2.2和4.3上的Blob时,它失败了:
code: "storage/unknown"
message: "Firebase Storage: An unknown error occurred, please check the error payload for server response."
serverResponse: "multipart body does not contain 2 or 3 parts."
name: "FirebaseError"
这在Android 5.0.1和4.4.2设备上运行良好。
问题:这是Android(或包含webkit)版本的硬性限制吗?或者我使用的firebase.js API不兼容?我想知道这个问题是否可以解决,还是什么都做不了。
我能找到的关于这个错误消息的唯一其他引用是:https://github.com/davideast/firebase-react-native-sample/issues/5
但鉴于这是一个离子包装应用程序,我确实可以访问Blob类型。
该文件是通过使用cordova-plugin-camera扩展拍摄照片创建的,并使用Camera.DestinationType.FILE_URI
将其保存到手机的本地存储中然后使用cordova-plugin-file扩展名将其读回Blob,然后保存到Firebase Storage(特别是Google Cloud Store支持的存储,因为这使用的是Firebase v3)。
Blob似乎已成功创建(尽管如果新的Blob构造函数不可用,它可能会退回到使用BlobBuilder—参见代码片段)
相关的代码部分(来自AngularJS控制器)如下所示:
var makeBlob = function(data, mimeString) {
try {
return new Blob([data], {
type: mimeString
});
} catch (err) {
var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
var bb = new BlobBuilder();
bb.append(data);
return bb.getBlob(mimeString);
}
};
$scope.uploadLocalImageAsync = function(localImageFileUrl, responseKey, description) {
var deferred = $q.defer();
$window.resolveLocalFileSystemURL(localImageFileUrl, function fileEntrySuccess(fileEntry) {
fileEntry.file(function fileSuccess(file) {
var reader = new FileReader();
reader.onloadend = function(evt) {
try {
var imageBlob = makeBlob(evt.target.result, 'image/jpeg');
alert("imageBlob: " + JSON.stringify(imageBlob));
var metadata = {
contentType: 'image/jpeg',
customMetadata: {
'response': responseKey,
'description': description
}
};
// Create a root reference
var storageRef = firebase.storage().ref();
var fileRef = storageRef.child('images/' + responseKey + '/' + file.name);
var uploadTask = fileRef.put(imageBlob, metadata);
uploadTask.on('state_changed', function(snapshot) {
// Observe state change events such as progress, pause, and resume
// See below for more detail
alert(JSON.stringify(snapshot));
}, function(error) {
// Handle unsuccessful uploads
alert(JSON.stringify(error));
deferred.reject("Upload failed: " + error.code + ": " + error.message)
}, function() {
// Handle successful uploads on complete
// For instance, get the download URL: https://firebasestorage.googleapis.com/...
var downloadURL = uploadTask.snapshot.downloadURL;
deferred.resolve({
gsPath: fileRef.toString(),
downloadUrl: downloadURL
});
});
} catch (err) {
deferred.reject("onloadend error: " + err);
}
};
try {
reader.readAsArrayBuffer(file);
} catch (err) {
deferred.reject("readAsArrayBuffer error: " + err);
}
}, function fileFailure() {
deferred.reject("Couldn't make File object");
});
},
function fileEntryFailure() {
deferred.reject("Couldn't find fileEntry for image");
});
return deferred.promise;
};
localImageFileUrl的格式为"file:///storage/sdcard0/Android/data/com.ionicframework.myapp/cache/1471426280702.jpg"
这个函数实际上返回一个promise,稍后在AngularJS控制器的另一部分进行解析。
启动uploadTask失败。
同样,这在Android 5.0.1, 4.4.2上工作,但在4.3,4.2.2上失败
我希望在Ionic中有一些额外的设置或我错过的东西。但我真的不知道是什么导致了行为上的差异,也不知道我能做些什么。
我尝试过的事情:
我已经尝试将cordova android平台降级到3.5以专门针对android-17(4.2.2)(使用类似于这里https://stackoverflow.com/a/32672214/6729807的东西),但它会产生相同的错误。
(我也把不同的插件降级到适当的级别)
正在使用的工具的版本信息:
离子信息:您的系统信息:
Cordova CLI: 6.3.1
Ionic Framework Version: 1.3.1
Ionic CLI Version: 2.0.0
Ionic App Lib Version: 2.0.0-beta.20
OS:
Node Version: v4.4.7
ionic平台版本android:
Installed platforms:
android 5.2.1
/平台/android/AndroidManifest.xml
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
/平台/android/项目。属性(和CordovaLib project.properties)
target=android-23
安装插件:cordova-plugin-camera
cordova-plugin-compat
cordova-plugin-file
cordova-plugin-geolocation
cordova-plugin-whitelist
使用https://www.gstatic.com/firebasejs/3.3.0/firebase.js
和https://github.com/firebase/angularfire (release v2.0.1)
The resolving key was using RNFetchBlob.polyfill.XMLHttpRequest;
import RNFetchBlob from 'react-native-fetch-blob';
const Blob = RNFetchBlob.polyfill.Blob;
window.XMLHttpRequest = RNFetchBlob.polyfill.XMLHttpRequest;
window.Blob = Blob;
install package
- https://github.com/wkh237/react-native-fetch-blob
and execute code
- https://github.com/wkh237/rn-firebase-storage-upload-sample/blob/master/index.common.js
also read http://stackoverflow.com/questions/39160006/react-native-firebase-storage-upload-using-putstring-call
- 在phonegap android中上传多个文件时,使用jquery ui显示进度条
- 使用我在模拟器中创建的Canvas签名板,它运行良好,但在android设备中,两个签名板即将推出
- Cordova Android javascript,用于检查多个复选框值
- Android + jQuery - 第二个向左滑动不会执行
- Android & Javascript - 从两个函数到一个函数
- 带有多个按钮的 Android 调用方法,可修改方法的 setText
- Android原生应用程序:无法滚动浏览包含大约200个元素的整个列表(appium java客户端)
- Jquery Mobile我有两个页面,一个用于Android,一个用于iPhone.如何检测浏览器并分配它们
- 在 Android 中使用多个 Web 视图来模拟 Javascript 线程
- 在 android 中向 JavascriptInterface 添加两个不同的类对象
- 如何在android中一次调用多个java脚本函数来加载webview
- 在iOS和Android中下载多个文件
- 如何使用css3使效果从上到下拉动1个页面,如android标题栏
- Android Webview LoadURL用两个字符串调用javascript
- Android我需要在数组的中间字符串的中间1个Superscript字符
- 为什么我在Android上下载appcelerator移动中的多个文件时内存不足?
- Android webview在loadUrl方法中加载多个java脚本函数
- 使用两个触摸拖动iOS &android
- SoundManager2在Android上同时播放多个声音
- android上的多个HTML文件上传控件