Android Firebase загружает неправильный URL-адрес изображений (ПРОБЛЕМА: отсутствует заголовок X-Goog-Upload-Comment) - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь загрузить и загрузить изображения из базы данных Firabase, в которой есть URL-ссылка на Firebase Storage. Проблема в том, что странный URL-адрес сохраняется в базе данных (см. Ссылку внизу). Что я должен сделать, чтобы получить нормальный URL, который я смогу использовать для загрузки и загрузки изображения в мое приложение для Android? Заранее спасибо!

Здесь я размещаю код, который использую:

Загрузка в базу данных и хранилище Firebase:

mStorageRef = FirebaseStorage.getInstance().getReference();
mDataBaseRef = FirebaseDatabase.getInstance().getReference();

if (mImageUri != null)
{
    final StorageReference fileReference = mStorageRef.child(nameimage + "." + getFileExtension(mImageUri));

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

            Toast.makeText(AddAdvertisement.this, "Upload successful!", Toast.LENGTH_LONG).show();

            Upload upload = new Upload(et_localization, taskSnapshot.getUploadSessionUri().toString());
            String uploadId = mDataBaseRef.push().getKey();
            mDataBaseRef.child(uploadId).setValue(upload);


        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(AddAdvertisement.this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

И скачать с Firebase:

databaseReference = FirebaseDatabase.getInstance().getReference();

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        for (DataSnapshot postSnapshot : dataSnapshot.getChildren())
        {
            Upload upload = postSnapshot.getValue(Upload.class);
            mUploads.add(upload);
        }

        mAdapter = new AdverisementAdapter(getContext(),mUploads);
        mrecyclerView.setAdapter(mAdapter);
    }

и Пикассо для получения изображения:

@Override
public void onBindViewHolder(@NonNull ImageViewHolder imageViewHolder, int i) {

    Upload uploadCurrent = mUploads.get(i);

    imageViewHolder.textViewName.setText(uploadCurrent.getName());

    Picasso.get().load(uploadCurrent.getUrl()).into(imageViewHolder.imageView);
}

Пикассо работает нормально, потому что кроме формы, которую я также получаю из строки Firebase с именем, которое загружается соответствующим образом. Итак, проблема, я думаю, что это просто с этим неправильным URL:

https://firebasestorage.googleapis.com/v0/b/my_name/o?name=image.jpg&uploadType=resumable&upload_id=AEnB2UrrOhqOVqTHuRRVRmlkf4Gh6y5xd_w5IvRok1SNVOMNnz34dqWFJ5_lPD0DNJr05mrHrT8g97sy0d4BZAdiB6v7skkLSQ&upload_protocol=resumable

Когда я пытаюсь ввести эту ссылку, я получаю сообщение об ошибке такого типа:

Неверный запрос. Заголовок X-Goog-Upload-Command отсутствует.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы записываете это значение в базу данных:

taskSnapshot.getUploadSessionUri().toString()

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

Поскольку вы хотите сохранить URL-адрес для загрузки, этот вызов довольно бесполезен для вашего дела. Вместо этого вы должны позвонить getDownloadUrl(), чтобы (асинхронно) получить URL-адрес для загрузки недавно загруженного файла:

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

        Toast.makeText(AddAdvertisement.this, "Upload successful!", Toast.LENGTH_LONG).show();

        fileReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                String url = uri.toString();
                Upload upload = new Upload(et_localization, url);
                String uploadId = mDataBaseRef.push().getKey();
                mDataBaseRef.child(uploadId).setValue(upload);
            }
        });

    }
})...

Обратите внимание, что это довольно хорошо описано в документации Firebase о получении URL-адреса для загрузки после загрузки файла , в которое входит пример выполнения того же самого с использованием continueWithTask вместо вложенных обратных вызовов (которые Я сделал выше).

0 голосов
/ 16 января 2019

Согласно официальной документации относительно метода getUploadSessionUri () метода UploadTask.TaskSnapshot:

Возвращает Uri сеанса, действительный в течение приблизительно одной недели, который можно использовать для возобновлениязагрузите позже, передав это значение в putFile(Uri, StorageMetadata, Uri).

Боюсь, что это не Uri, который вы ищете.Чтобы получить правильный URI, пожалуйста, смотрите мой ответ из этого сообщения .

...