Объект не существует в расположении в Android FireBase загрузить файл - PullRequest
2 голосов
/ 08 июля 2019

Я пытаюсь создать приложение, используя сервис хранилища Firebase.У меня есть функция, которая сохраняет изображение из локального хранилища устройства, использует URI изображения, чтобы сохранить его в базе данных.При попытке загрузить изображение на сервер 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?

edit -

попробовал это решение из комментариев, но все еще получаю ту же ошибку -


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();

        }
    }


Ответы [ 3 ]

0 голосов
/ 08 июля 2019

Заменить следующий код:

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

с этим:

            StorageReference fileRefrence = storageReference.child(imageUri.getLastPathSegment());
0 голосов
/ 08 июля 2019

Это код, который я использовал для своего проекта и его работы ... Также убедитесь, что

  • у вас есть общедоступные правила для хранилища Firebase
  • добавлено разрешение в вашем файле манифеста для доступа к памяти телефона и интернету
  • добавлены все необходимые зависимости для доступа к хранилищу Firebase

StorageReference storageReference;
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
}); 
0 голосов
/ 08 июля 2019

Попробуйте этот код

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) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...