如何从firebase存储中获取正确的URL以访问.NET中的文件?

gcuhipw9  于 2023-06-24  发布在  .NET
关注(0)|答案(1)|浏览(94)

我的照片被成功地保存在我的firebase存储,虽然我只是不能通过形成的链接访问它。当我尝试时,我收到以下消息:

{
  "error": {
    "code": 400,
    "message": "Invalid HTTP method/URL pair."
  }
}

据我所知,这个错误只能发生在给定的URL不正确的情况下。对吧?
我将分享我在firebase上保存图片的整个代码片段如下:

if (FirebaseApp.DefaultInstance == null)
            {
                //var serviceAccountPath = Path.Combine(rootDirectory, "Credentials", "connect-vistorias-firebase-adminsdk-33gel-857c85cf70.json");
                FirebaseApp.Create(new AppOptions
                {
                    Credential = GoogleCredential.GetApplicationDefault()
                });
            }
                
            var bucketName = "bucketname";
            var storage = StorageClient.Create();

            #region Medidores
            if (model.Medidores != null && model.Medidores.Any())
            {
                foreach (var item in model.Medidores)
                {
                    var prop = item.Id > 0 ? db.VistoriasMedidors.FirstOrDefault(c => c.Id == item.Id) : new VistoriasMedidor();
                    prop.Desligado = item.Desligado;
                    var listaFotos = new List<string>();

                    foreach (string fileName in Request.Files)
                    {
                        if (fileName == "Medidores[" + item.Index + "].upFotos")
                        {
                            HttpPostedFileBase file = Request.Files[fileName];
                            if (file != null && file.ContentLength > 0)
                            {
                                var fileName1 = $"{DateTime.Now:yyyy-MM-dd-HHmm}-{Guid.NewGuid()}-{file.FileName}";

                                using (var stream = file.InputStream)
                                {
                                    var objectName = $"Medidores/{fileName1}";
                                    storage.UploadObject(bucketName, objectName, null, stream);

                                    var fileUrl = $"https://firebasestorage.googleapis.com/v0/b/{bucketName}/o/{objectName}?alt=media";
                                    listaFotos.Add(fileUrl);

                                }
                            }
                        }
                    }

                    prop.Fotos = JsonConvert.SerializeObject(listaFotos);
                    prop.Leitura = item.Leitura;
                    prop.Medidor = item.Medida;

                    if (prop.Id == 0)
                    {
                        prop.IdVistoria = vistoria.Id;
                        prop.IdAppInterno = Guid.NewGuid().ToString();
                        prop.Tipo = item.Tipo;
                        db.VistoriasMedidors.Add(prop);
                        //db.SaveChanges();
                    }
                }
            }
            else if (novo)
            {
                for (int i = 1; i <= 4; i++)
                {
                    var prop = new VistoriasMedidor();
                    prop.Desligado = true;
                    var listaFotos = new List<string>();

                    prop.Fotos = Newtonsoft.Json.JsonConvert.SerializeObject(listaFotos);
                    prop.Leitura = "";
                    prop.Medidor = "";

                    if (prop.Id == 0)
                    {
                        prop.IdVistoria = vistoria.Id;
                        prop.IdAppInterno = Guid.NewGuid().ToString();
                        prop.Tipo = i;
                        db.VistoriasMedidors.Add(prop);
                        //db.SaveChanges();
                    }
                }

            }

请注意我如何保存我的URL:
var fileUrl = $"https://firebasestorage.googleapis.com/v0/b/{bucketName}/o/{objectName}? alt=media";
是我遗漏了什么,还是这真的是保存URL的正确方法?我知道在其他语言中,您可以通过更改最后一行来声明公共URL:
var fileUrl = storage.GetDownloadUrl(bucketName, objectName);
但在.NET中,这是不可能的,因为GetDownloadUrl不包含在firebase库中。我已经更改了“规则”中的权限,如下所示:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

如果有人能指出我在哪里错过了什么,我将不胜感激。

ljsrvy3e

ljsrvy3e1#

安全规则仅在您通过Firebase SDK访问数据时应用。看起来您想生成一个直接的URL来访问它,在这种情况下,安全规则永远不会应用。
如果您有Firebase提供的客户端SDK,您确实可以指示它生成一个所谓的下载URL,它提供对文件的公共只读访问。此方法(如您所发现)不存在于非Firebase SDK中,例如Google Cloud SDK for C#/. NET。
在这样的平台中,您可以选择:

  • 使存储桶中的所有文件都可以公开访问,如making data public上的文档所示。此时,访问各个文件的URL将与上面创建的URL类似。
  • 为每个文件生成一个签名的URL,它类似于下载URL,但在定义的时间段内(可以根据需要延长)提供公共访问。有关这方面的更多信息,请参阅Creating a GET-signed URL for an object using Cloud Storage libraries (V4)的文档,其中还包含一个C#代码示例。

相关问题