【问题标题】:Not uploading pictures to Firebase storage不将图片上传到 Firebase 存储
【发布时间】:2017-07-09 17:03:02
【问题描述】:

我想上传图片到存储。每次启动模拟器时,我都没有收到任何错误,并且一切正常,除了当我在模拟器中选择图片并上传它们时,即使刷新后它也不会显示在 Firebase 存储部分中。这是我的代码:

    package com.safariagaming;

import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import com.safariagaming.mtc_project.R;

public class Account_Page extends AppCompatActivity {

    private Button mSelectImage;

    private StorageReference mStorage;

    private static final int GALLERY_INTENT = 2;

    private ProgressDialog mProgressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_account__page);

        mSelectImage = (Button) findViewById(R.id.selectImage_BUTTON);

        mStorage = FirebaseStorage.getInstance().getReference(); //.child at end ifyou want to add an child to it

        mProgressDialog = new ProgressDialog(this);


        mSelectImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(Intent.ACTION_PICK);

                intent.setType("image/*");

                startActivityForResult(intent, GALLERY_INTENT);

            }
        });

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == GALLERY_INTENT && resultCode == RESULT_OK){

            mProgressDialog.setMessage("Uploading...");

            Uri uri = data.getData();

            StorageReference filepath = mStorage.child("Photos").child(uri.getLastPathSegment());

            filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {


                    Toast.makeText(Account_Page.this, "Upload Done", Toast.LENGTH_LONG).show();

                mProgressDialog.dismiss();
                }//you can also add onFaliure listener
            });


        }

    }
}

【问题讨论】:

    标签: android firebase firebase-storage


    【解决方案1】:

    将文件存储为流而不是 Uri

    删除 Uri 部分并改为:

    InputStream inputStream = this.getContentResolver().openInputStream(data.getData());
    

    并将putFile(uri) 更改为putFile(inputStream)

    并且还考虑使用合理的文件名更改uri.getLastPathSegment() 部分,例如your_name.png(请注意,即使您的照片不是png 格式,根据我的经验也可以使用)
    这应该工作

    【讨论】:

    • 我试过你说的,但得到一个错误。 pastebin.com/GJyGw3tV也许我误解了你想说的意思
    • pastebin.com 在我的国家是被禁止的,你介意使用其他平台吗
    • 我错过了,但 Android Studio 应该警告过你。您必须为输入流放置 try-catch 语句
    【解决方案2】:

    这就是我将图像上传到存储空间的方式

    FirebaseStorage storage = FirebaseStorage.getInstance();
    StorageReference storageRef = storage.getReferenceFromUrl(FILE_STORAGE_PATH);
    InputStream stream = null;
    try {
        stream = new FileInputStream(new File(uri.getLastPathSegment()));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    StorageReference photoRef = storageRef.child("Photos/" + image_name + ".jpg");
            UploadTask uploadTask = photoRef.putStream(stream);
            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
    
                    Log.d(TAG, "Success TO UPLOAD IMAGE");
    
    
                }
            }).addOnFailureListener(WorkCompletionActivity.this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    //Failure
                }
            });
    

    【讨论】:

      【解决方案3】:

      该代码非常适合我。 只需在 Firebase 控制台中更改规则

      allow read, write: if true;
      

      一切都会完美运行

      【讨论】:

        猜你喜欢
        • 2016-12-24
        • 2020-04-01
        • 2020-09-07
        • 2018-02-26
        • 2016-11-28
        相关资源
        最近更新 更多