当前位置: 首页 > 知识库问答 >
问题:

Android Firebase上传图片的URL错误(问题:X-Goog-Upload-Comment头丢失)

柴嘉石
2023-03-14

我正在尝试从Firabase数据库上传和下载图像,该数据库有一个指向Firebase存储的URL链接。问题是这个奇怪的URL正在被保存到数据库中(参见底部的链接)。我应该怎么做才能获得一个正常的URL,我可以使用do downloand将图像导入我的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

当我试图进入这个链接时,我收到了这样的错误:

无效的请求。缺少X-Goog-Upload-Command头。

共有3个答案

楚勇
2023-03-14
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) {
                
               // just do your task //like hashmaps to put in

            }
        });

    }
})
蔚桐
2023-03-14

根据官方留档关于UploadTaskSnapshot的getUploadSessionUri()方法:

返回会话Uri,有效期约为一周,通过将此值传递到putFile(Uri,StorageMetadata,Uri)中,可用于稍后恢复上载。

恐怕这不是您要找的Uri。要获得正确的uri,请参阅我在本文中的答案。

郎鹤龄
2023-03-14

您正在将此值写入数据库:

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进行了很好的描述,该事件包括通过使用继续与任务而不是嵌套回调来完成相同操作的示例(我在上面做了)。

 类似资料:
  • 请问下uniapp打包成app怎么上传图片,可以用chooseImage上传图片吗,chooseImage是不是已经被淘汰了,新版的chooseMedia不支持

  • 本文向大家介绍Yii+upload实现AJAX上传图片的方法,包括了Yii+upload实现AJAX上传图片的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Yii+upload实现AJAX上传图片的方法。分享给大家供大家参考,具体如下: 控制器代码: VIEW代码: 更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《sm

  • 我用的uniapp中的uview想弄一个上传图片的功能 前端上传图片的代码: 后端用的buildadmin: 最后提示:Provisional headers are shown没有任何返回信息,但这接口在apifox里测试是没有问题的。 其中线索:上传时有这两个请求,有下面的提示。

  • 定义 上传组件。 图片展示 代码演示 import Upload from 'pile/dist/components/upload' const { UploadImage, UploadImageArray } = Upload; // 单张图片上传 <UploadImage onLoadSuccess={(o) => { console.log(o); }} /> // 多张图片上传(默

  • Upload 上传 平台差异说明 App H5 微信小程序 支付宝小程序 百度小程序 头条小程序 QQ小程序 √ √ √ √ √ √ √ 基本使用 可以通过设置file-list参数(数组,元素为对象),显示预置的图片。其中元素的url属性为图片路径 设置action参数为后端服务器地址,注意H5在浏览器可能会有跨域限制,让后端允许域即可 <template> <u-upload :action

  • 通过点击或者拖拽上传文件 点击上传 通过 slot 你可以传入自定义的上传按钮类型和文字提示。可通过设置limit和on-exceed来限制上传文件的个数和定义超出限制时的行为。可通过设置before-remove来阻止文件移除操作。 <el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/po