我的照片被成功地保存在我的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;
}
}
}
如果有人能指出我在哪里错过了什么,我将不胜感激。
1条答案
按热度按时间ljsrvy3e1#
安全规则仅在您通过Firebase SDK访问数据时应用。看起来您想生成一个直接的URL来访问它,在这种情况下,安全规则永远不会应用。
如果您有Firebase提供的客户端SDK,您确实可以指示它生成一个所谓的下载URL,它提供对文件的公共只读访问。此方法(如您所发现)不存在于非Firebase SDK中,例如Google Cloud SDK for C#/. NET。
在这样的平台中,您可以选择: