- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在构建一个要在 Android 5 和 4 上部署的 Ionic 应用程序。当我尝试使用 Firebase v3 存储引用(使用 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
但鉴于这是一个 ionic 包装器应用程序,我确实可以访问 Blob 类型。
该文件是通过使用 cordova-plugin-camera 扩展拍摄照片创建的,使用 Camera.DestinationType.FILE_URI 将其保存到手机本地存储
然后使用 cordova-plugin-file 扩展将它读回 Blob,然后保存到 Firebase 存储(特别是 Google Cloud Store 支持的存储,因为它使用的是 firebase v3)。
Blob 似乎已成功创建(尽管如果新的 Blob 构造函数不可用,它可能会回退到使用 BlobBuilder - 请参阅代码 fragment )
相关代码部分(来自 AngularJS Controller )如下所示:
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 Controller 的另一部分解决。
启动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 的内容),但它会产生相同的错误。
(我也将不同的插件降级到适当的级别)
有关正在使用的工具版本的一些信息:
ionic 信息:
您的系统信息:
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
/platforms/android/AndroidManifest.xml
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
/platforms/android/project.properties(和 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(发布 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
关于javascript - Firebase Storage v3 在 Android 4.2.2 和 4.3 上返回 "multipart body does not contain 2 or 3 parts",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39018980/
嗨,当尝试将图像上传到 firebase 存储时,我正在使用 firebase 文档,但是出现此错误。 在范围内找不到“存储” let storage = Storage.storage() le
我最近在使用 Firebase 存储时遇到了一些问题。 当我们尝试访问刚刚上传的文件时,浏览器中出现此错误消息 { "error": { "code": 400,
这些是在不同版本的 NuGet 包之间迁移的重要指南: https://github.com/Azure/azure-sdk-for-net/blob/Azure.Storage.Blobs_12.6
警告: Warning: Can't resolve all parameters for Storage in /Users/zzm/Desktop/minan/node_modules/@ioni
我在圆形立方体中收到此错误(“连接到存储服务器失败”)行。我已经检查了所有内容,配置和数据库用户名密码,服务器详细信息都是干净的。谁能告诉我可能是什么问题。这里我给出了整个配置文件。
我希望能够限制容器的大小,但是使用默认的存储驱动程序aufs(对于Ubuntu 14.04),当我尝试使用--storage-opt参数时出现错误 $ docker create -it --name
我希望能够支持对使用 Google Cloud Storage 托管的静态 Assets 进行 Brotli 和 Gzip 编码。为此,我想在将文件上传为 之前对其进行编码, .gz和 .br .问
场景 我有几个由 Google Cloud Storage object.finalize 事件触发的 Google Cloud Functions。为此,我使用两个存储桶并使用“同步选项:覆盖目标位
我在 Google Cloud Storage 中有一个存储桶和一个网站。人们目前可以通过网站上传到存储桶(使用 Google 身份验证)。 但是,我需要设置它以便任何人都可以查看上传的文件(并且不能
如果文件被放入 Google Cloud 存储并公开,但该文件的网址在另一个网页上不存在,那么 Google 是否会在其搜索结果中将其编入索引?有人知道吗? 最佳答案 Google 的搜索索引独立于其
截至今天早上,我无法访问我的存储桶。 当我在导航上选择 Google Cloud Storage 选项卡时,一切都按预期加载,但不是显示我的两个存储桶,而是显示一个警告栏说: We were unab
我想弄清楚是否可以在 Windows 平台上使用 gsutil 的 cp 命令将文件上传到 Google Cloud Storage。我的本地计算机上有 6 个文件夹,每天都会向其中添加新的 pdf
我最近开始使用 Google Cloud Storage。最初我在安装 Cloud SDK 时创建了一个虚拟项目。现在我正在做另一个项目。 gsutil 仍然指向我以前的项目。我如何使它指向我的新项目
我目前正在这样做,但它非常慢,因为我的存储桶中有几 TB 的数据: gsutil du -sh gs://my-bucket-1/ 对于子文件夹也是如此: gsutil du -sh gs://my-
这可能看起来很天真,我知道我们可以在 blob 中创建文件夹,并且这些文件夹仍然存储在容器中。我们仍然可以对这些“blob 中包含的文件夹”执行通常对文件存储中的文件夹执行的所有操作。 我们仍然可以像
将文件上传到 Google Cloud Storage 时,有一个自定义数据字段元数据。 Google's example相当短: var metadata = { contentType: 'a
这可能看起来很天真,我知道我们可以在 blob 中创建文件夹,并且这些文件夹仍然存储在容器中。我们仍然可以对这些“blob 中包含的文件夹”执行通常对文件存储中的文件夹执行的所有操作。 我们仍然可以像
我有一个包含超过 2 万个文件名的 Google Storage 存储桶。有没有办法在短时间内列出存储桶中的所有文件名? 最佳答案 这取决于您所说的“短”是什么意思,但是: 您可以做的一件事来加快列出
有谁知道如果文件不存在,您是否需要为 Google Cloud Storage 中的文件请求付费?换句话说,有人访问您存储桶中不存在的文件是否计入您的请求?还是仅适用于存在的文件? 最佳答案 客户无需
在每一分钟结束时,我的代码总共会上传 20 到 40 个文件(从多台机器上并行上传大约 5 个文件,直到全部上传完毕)到 Google Cloud Storage。我经常收到 429 - Too Ma
我是一名优秀的程序员,十分优秀!