android - android firebase putStream(): E/StorageException: 关闭 java.io.IOException: 关闭
问题描述
我正在尝试将图片上传到 Firebase。如果我将图片从 加载InputStream
到我的应用程序并使用 上传putBytes()
,它可以工作,如果我尝试使用 直接上传图片putStream()
,我会收到一条错误消息,表明流已关闭:
11-09 14:16:39.126 26077-26586/com.finder E/StorageException:发生了 StorageException。 发生未知错误,请检查服务器响应的 HTTP 结果代码和内部异常。 代码:-13000 HttpResult:200 11-09 14:16:39.126 26077-26586/com.finder E/StorageException: 关闭 java.io.IOException:关闭 在 com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:366) 在 com.google.firebase.storage.internal.AdaptiveStreamBuffer.fill(com.google.firebase:firebase-storage@@16.0.4:107) 在 com.google.firebase.storage.UploadTask.uploadChunk(com.google.firebase:firebase-storage@@16.0.4:396) 在 com.google.firebase.storage.UploadTask.run(com.google.firebase:firebase-storage@@16.0.4:205) 在 com.google.firebase.storage.StorageTask.lambda$getRunnable$7(com.google.firebase:firebase-storage@@16.0.4:1106) 在 com.google.firebase.storage.StorageTask$$Lambda$12.run(com.google.firebase:firebase-storage@@16.0.4) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 在 java.lang.Thread.run(Thread.java:818)
上传图片的方法:
static class UploadPicAsyncWrapperTask extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... strings) {
String picsFolder = strings[0];
String id = strings[1];
final String url = strings[2];
final String profilepicNodeName = strings[3];
final String picsNodeName = strings[4];
final StorageReference filePathRoot = FirebaseStorage.getInstance().getReference().child(picsFolder).child(FirebaseAuth.getInstance().getCurrentUser().getUid());
final StorageReference filePath = filePathRoot.child(id);
try (InputStream is = new URL(url).openStream()) { StorageMetadata.Builder().setContentType("image/jpg").setContentLanguage("en").build();
UploadTask uploadTask = filePath.putStream(is);
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
if (profilePicName == null) {
mUserDatabase.child(profilepicNodeName).setValue(uri.toString());
profilePicName = uri.toString();
} else {
mUserDatabase.child(picsNodeName).child(Helper.imageUrlToFirebasePath(uri.toString())).setValue(uri.toString());
}
--picsRemaining;
}
});
}
});
} catch (MalformedURLException e) {
Log.e(TAG, "BufferedInputStream DIIIIID throw MalformedURLException 2 " + e.getMessage());
} catch (IOException e) {
Log.e(TAG, "BufferedInputStream DIIIIID throw IOException 2 " + e.getMessage());
} catch (Exception e) {
Log.e(TAG, "BufferedInputStream DIIIIID throw Exception 2 " + e.getClass() + " " + e.getMessage());
}
return null;
}
}
我使用 anInputStream
或 a都没关系BufferedInputStream
。
恢复 UploadTask 会导致 E/StorageException: BufferedInputStream is closed 说要使用另一个版本的 Firebase,但由于它是一个旧帖子,我已经是。
解决方案
推荐阅读
- c# - 正则表达式不会覆盖旧值
- php - 如何将 PHP 页面包含到另一个页面的 div 中?
- javascript - 如何使用 jquery 和 lodash 去抖动输入
- javascript - 拖放文件上传
- linux - 如何在 Windows 上为导入的 Laravel 项目重新配置 GIT 并部署到 Linux 服务器
- java - 从 Hadoop 工具传回多个值
- c# - WCF 客户端应用程序开始不断收到超时异常
- php - 如何在 Eclipse PHP 上使用 PDO MySQL 并在 PHP CLI 应用程序中运行?
- javascript - getElementById().style.display 不切换 HTML 按钮(显示/隐藏)
- azure-active-directory - 如何将来自 IdentityServer 3 的声明存储在 Azure AD B2C 中,或者仅将其包含在 AAD B2C 颁发的令牌中