首页 > 解决方案 > 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,但由于它是一个旧帖子,我已经是。

标签: androidfirebaseinputstreamfirebase-storage

解决方案


推荐阅读