【问题标题】:Object does not exists at location at android firebase upload fileandroid firebase上传文件的位置不存在对象
【发布时间】:2019-07-08 07:31:50
【问题描述】:

我正在尝试使用 Firebase 存储服务创建应用。我有一个从设备本地存储中保存图像的功能,使用图片的 URI 将其保存到 firebase。尝试将图像上传到 firebase 服务器时,我得到“该位置不存在对象”,这可能意味着我的 URI 存在问题。

我正在添加整个活动,以便您查看发生了什么 -


public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    public static final int PICK_IMAGE_REQUEST = 1;
    public static final int DELAY_MILLIS = 5000;

    private Button buttonChooseImage, buttonUpload;
    private TextView textViewShowUpload;
    private EditText editTextFileName;
    private ImageView imageView;
    private ProgressBar progressBar;

    private Uri imageUri;
    private StorageReference storageReference;
    private DatabaseReference databaseReference;

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

        buttonChooseImage = findViewById(R.id.button_choose_image);
        buttonUpload = findViewById(R.id.button_upload);
        textViewShowUpload = findViewById(R.id.text_view_show_uploads);
        editTextFileName = findViewById(R.id.edit_text_file_name);
        imageView = findViewById(R.id.image_view);
        progressBar = findViewById(R.id.progress_bar);

        buttonChooseImage.setOnClickListener(this);
        buttonUpload.setOnClickListener(this);
        textViewShowUpload.setOnClickListener(this);

        storageReference = FirebaseStorage.getInstance().getReference("uploads");
        databaseReference = FirebaseDatabase.getInstance().getReference("uploads");


    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button_choose_image:
                openFileChooser();
                break;
            case R.id.button_upload:
                uploadFile();
                break;
            case R.id.text_view_show_uploads:

                break;
        }
    }

    private String getFileExtension(Uri uri) {
        ContentResolver cr = getContentResolver();
        MimeTypeMap mine = MimeTypeMap.getSingleton();
        return mine.getExtensionFromMimeType(cr.getType(uri));
    }

    private void uploadFile() {
        if (imageUri != null) {
            StorageReference fileRefrence = storageReference.child(System.currentTimeMillis()
                    + "." + getFileExtension(imageUri));
            fileRefrence.putFile(imageUri).
                    addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            Handler handler = new Handler();
                            handler.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    progressBar.setProgress(0);
                                }
                            }, DELAY_MILLIS);

                            Toast.makeText(MainActivity.this, "Upload Successful", Toast.LENGTH_LONG).show();
                            Upload upload = new Upload(editTextFileName.getText().toString().trim(),
                                    taskSnapshot.getMetadata().getReference().getDownloadUrl().toString());
                            String uploadId = databaseReference.push().getKey();
                            databaseReference.child(uploadId).setValue(upload);

                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            e.printStackTrace();
                            Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    })
                    .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                            double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                            progressBar.setProgress((int) progress);
                        }
                    });
        } else {
            Toast.makeText(this, "No File Selected", Toast.LENGTH_SHORT).show();

        }
    }

    private void openFileChooser() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent, PICK_IMAGE_REQUEST);
    }

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

        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
                && data != null && data.getData() != null) {
            imageUri = data.getData();
            Picasso.get().load(imageUri).into(imageView);

        }
    }
}


我是否错误地实现了 URI?

编辑 -

从 cmets 尝试了这个解决方案,但仍然得到同样的错误 -


private void uploadFile() {
        if (imageUri != null) {
            StorageReference fileReference = storageReference.child("images/" + imageUri.getLastPathSegment());
            UploadTask uploadTask = fileReference.putFile(imageUri);
            uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            progressBar.setProgress(0);
                        }
                    }, DELAY_MILLIS);

                    Toast.makeText(MainActivity.this, "Upload Successful", Toast.LENGTH_LONG).show();
                    Upload upload = new Upload(editTextFileName.getText().toString().trim(),
                            taskSnapshot.getMetadata().getReference().getDownloadUrl().toString());
                    String uploadId = databaseReference.push().getKey();
                    databaseReference.child(uploadId).setValue(upload);
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    e.printStackTrace();
                    Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                    double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                    progressBar.setProgress((int) progress);
                }
            });



        } else {
            Toast.makeText(this, "No File Selected", Toast.LENGTH_SHORT).show();

        }
    }


【问题讨论】:

  • 是图像显示在 imageView Picasso.get().load(imageUri).into(imageView);,还是 getFileExtension 给你正确的扩展?
  • 关于图像视图 - 是的,它正在显示。关于 getFileExtension - 似乎它没有打印以记录任何内容,我尝试在我的 uploadFile 方法中将 fileRefrence.getPath() 和 fileRefrence.getName() 都打印到日志中,但没有出现任何内容。
  • 您的文件是否已成功上传到 Firebase 存储,之后您可以更新 Firebase 实时数据库吗?
  • 不。没有任何内容被添加到 Firebase 存储中,显然我无法编辑任何内容。

标签: java android firebase firebase-storage


【解决方案1】:

对我来说,使用此代码可以上传。我在评论部分的https://www.youtube.com/watch?v=lPfQN-Sfnjw&list=PLrnPJCHvNZuBf5KH4XXOthtgo6E4Epjl8&index=4 得到了这个。还将您的 Firebase 存储中的身份验证设置为 true

private void uploadFile(){
    if(mImageUri!=null){
            storageReference.putFile(mImageUri).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>()
            {
                @Override
                public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception
                {
                    if (!task.isSuccessful())
                    {
                        throw task.getException();
                    }
                    return storageReference.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>()
            {
                @Override
                public void onComplete(@NonNull Task<Uri> task)
                {
                    if (task.isSuccessful())
                    {
                        Uri downloadUri = task.getResult();
                        Log.e("TAG", "then: " + downloadUri.toString());


                        Upload upload = new Upload(mEditTextFileName.getText().toString().trim(),
                                downloadUri.toString());
                        databaseReference.push().setValue(upload);
                        Toast.makeText(MainActivity.this, "Uploaded", Toast.LENGTH_SHORT).show();
                    } else
                    {
                        Toast.makeText(MainActivity.this, "upload failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                    }
                }
            });
    }
    else{
        Toast.makeText(this, "Please upload image!", Toast.LENGTH_SHORT).show();
    }
}

【讨论】:

    【解决方案2】:

    这是我用于我的项目及其工作的代码... 还要确保

    • 您已在 Firebase 存储上公开规则
    • 在清单文件中添加了访问手机存储和互联网的权限
    • 添加了 Firebase 存储访问所需的所有依赖项

    存储参考存储参考;
    storageReference = FirebaseStorage.getInstance().getReference();

    StorageReference refStorage = storageReference.child("images/"+uri.getLastPathSegment()); UploadTask uploadTask = refStorage.putFile(uri);

    Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
        @Override
        public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
            if (!task.isSuccessful()) {
                throw new Exception("task is not succeeded");
            } return refStorage.getDownloadUrl();
        }//end of throws Exception method
    }).addOnCompleteListener(new OnCompleteListener<Uri>() {
        @Override
        public void onComplete(@NonNull Task<Uri> task) {
            if (task.isSuccessful()) {
                downUri = task.getResult();
            } else {
                // Handle failures
                // ...
                Log.d("<<<<<<<<", "<<<<<<<<<<<<<<<<<<<< not uplooaded ");
            }
        }//end of onComplete()for getting download uri
    }); 
    

    【讨论】:

    • 您从项目中复制了一些不适合我的内容。根据我的 MainActivity,您能否解释一下我需要将这段代码放在哪一部分?
    • 更改您的代码---> StorageReference fileRefrence = storageReference.child(System.currentTimeMillis() + "." + getFileExtension(imageUri)); fileRefrence.putFile(imageUri)。有了这个---> StorageReference refStorage = storageReference.child("images/"+uri.getLastPathSegment()); UploadTask uploadTask = refStorage.putFile(uri);然后添加 onSuccessfullListeners。试试这个代码,它可能对你有帮助
    • 我已经用你的解决方案编辑了主帖,这样你就可以看到我根据你的建议做了什么——但没有任何改变。仍然出现相同的错误。
    • 能否给我看一下错误日志,以便我了解导致您的应用程序的错误。
    【解决方案3】:

    替换以下代码:

                StorageReference fileRefrence = storageReference.child(System.currentTimeMillis()
                        + "." + getFileExtension(imageUri));
    

    用这个:

                StorageReference fileRefrence = storageReference.child(imageUri.getLastPathSegment());
    

    【讨论】:

    • 仍然给我路径错误时对象不存在。我还需要改变什么吗?
    • 应该是imageUri.getLastPathSegment());,我有uri.getLastPathSegment()
    • 不起作用。试过了 - 请检查我在主帖上的编辑,看看我已经尝试过什么,如果你能提供一些很棒的解决方案。
    【解决方案4】:

    试试这个代码

    StorageReference imageReference = storageReference.child("uploads");  
    
                  UploadTask uploadTask = imageReference.putFile(imageuri);
                        uploadTask.addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Toast.makeText(verify.this, "Upload failed!", Toast.LENGTH_SHORT).show();
                            }
                        }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
    
                                if (taskSnapshot.getMetadata() != null) {
                                    if (taskSnapshot.getMetadata().getReference() != null) {
    
                                        Task<Uri> result = taskSnapshot.getStorage().getDownloadUrl();
                                        result.addOnSuccessListener(new OnSuccessListener<Uri>() {
                                            @Override
                                            public void onSuccess(Uri uri) {
    

    【讨论】:

    • 记得在需要的地方关闭需要的括号!!
    • 我对这段代码应该去哪里或应该替换什么感到有点困惑。你能说得更具体些吗?
    • 好的!您将代码从 StorageReference 复制到 ** DELAY_MILLIS** ,然后添加一个字符串以将 Uri 转换为字符串...基本上,它将是 *String imagepath=uri.toString * ,其中 uri 是上传图片的Uri
    • 我仍然很难理解你 - 我到底应该用什么替换什么?
    猜你喜欢
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2021-10-28
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多