【问题标题】:Upload image to firebase storage via HTTP Post通过 HTTP Post 将图像上传到 Firebase 存储
【发布时间】:2020-09-08 00:24:11
【问题描述】:

我想在 Flutter Web 应用程序中将图像上传到 Firebase 存储中。 到目前为止我做了什么:

  • 通过云功能接收签名URL;如此处所述Google guideline: Create signed URL - 在文章底部
  • 通过flutter包“image_picker_web”从本地文件加载图片Package-Link
  • 选择器提供 (Image-)Widget、Uint8List、html.File
  • 尝试通过 MultipartRequest 将图像上传到 signedURL,但收到错误:XMLHttpRequest error,但没有任何进一步的详细信息。

我的 MultipartRequest 代码(Uint8List 类型的字节):

var multipartFile = http.MultipartFile.fromBytes(
  'image', bytes, filename: 'test.jpeg', // optional
  contentType: new MediaType('image', 'jpeg'),
);
var uri = Uri.parse(url);
var request = http.MultipartRequest("POST", uri)
  ..files.add(multipartFile);
var response = await request.send();
if (response.statusCode == 200) print('Uploaded!');
response.stream.transform(utf8.decoder).listen((value) {
    print(value);
  });

...我也尝试过使用流:

var stream = http.ByteStream.fromBytes(bytes);
var multipartFile = new http.MultipartFile('file', stream, bytes.length,
      filename: 'test.jpeg', contentType: new MediaType('image', 'jpeg'));

我认为图像数据/类型 (MultipartFile) 有问题,或者 url 不起作用或完整的 MultipartRequest 不符合 firebase 存储

有人对此有解决方案吗?或者我该如何进一步调查这个问题?

【问题讨论】:

    标签: http flutter google-cloud-storage firebase-storage flutter-web


    【解决方案1】:

    如果您检查浏览器控制台,您很可能会收到 CORS 错误。

    有一种更好的方法可以将图片上传到 Firebase,这里是上传图片的代码,并接收存储图片的 URL。

    import 'dart:async';
    import 'package:firebase/firebase.dart' as fb;
    import 'dart:html' as html;
    
    String url;
    
    Future<String> uploadProfilePhoto(html.File image, {String imageName}) async {
      try {
        //Upload Profile Photo
        fb.StorageReference _storage = fb.storage().ref('displayPhotos/$imageName');
        fb.UploadTaskSnapshot uploadTaskSnapshot = await _storage.put(image).future;
        // Wait until the file is uploaded then store the download url
        var imageUri = await uploadTaskSnapshot.ref.getDownloadURL();
        url = imageUri.toString();
      } catch (e) {
        print(e);
      }
      return url;
    }
    

    【讨论】:

    • 这不是 OP 要求的。他想要一种通过 HTTP 帖子上传图片的方法,而不是使用 Firebase 存储插件。
    • @MAA - 这个问题已经有一年了。无论他是否想通过 HTTP Post 进行操作,我都提供了一个可行的解决方案。这消除了处理 POST 请求时的任何 CORS 问题。
    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 2017-09-25
    • 2018-10-24
    • 2019-01-22
    相关资源
    最近更新 更多