如何在 Dart http 库中使用 StreamedRequest 上传文件?

phq*_*hqb 3 rest file-upload http dart

我想通过这样的非multipart/form-data请求上传文件:

POST http://127.0.0.1/upload
Cache-Control: no-cache

< /path/to/file/in/disk
Run Code Online (Sandbox Code Playgroud)

(我测试并成功将文件从 JetBrain Rider 的 REST 客户端上传到我的 REST 端点。)

包中有一个StreamedRequest类,http但我没有找到任何构造函数或设置器来将字节流或文件内容插入其中。

如何使用StreamedRequestDart 上传文件?

Mar*_*ark 5

如果 pastebin 链接失效,我将发布 phqb 的解决方案:

final file = new File(filePath);

final streamedRequest =
    new http.StreamedRequest('POST', Configurations.getUserContentsApiUri('/upload'))
      ..headers.addAll({
        'Cache-Control': 'no-cache',
        'Authorization': 'Bearer $uploadToken',
      });
streamedRequest.contentLength = await file.length();
file.openRead().listen((chunk) {
  print(chunk.length);
  streamedRequest.sink.add(chunk);
}, onDone: () {
  streamedRequest.sink.close();
});

await streamedRequest.send();
print('after response');
Run Code Online (Sandbox Code Playgroud)


Gün*_*uer 4

在我的一些旧代码中我使用

  /// Send a POST request to the Docker service.
  Future<http.ByteStream> _streamRequestStream(
      String path, Stream<List<int>> stream,
      {Map<String, String> query}) async {
    assert(stream != null);
    final url = serverReference.buildUri(path, query);
    final request = new http.StreamedRequest('POST', url)
      ..headers.addAll(headersTar);
    stream.listen(request.sink.add);
    final http.BaseResponse response =
        await request.send().then(http.Response.fromStream);
    if (response.statusCode < 200 || response.statusCode >= 300) {
      throw new DockerRemoteApiError(
          response.statusCode, response.reasonPhrase, null);
    }
    return (response as http.StreamedResponse).stream;
  }
Run Code Online (Sandbox Code Playgroud)

这可能会做你想做的事

https://github.com/bwu-dart/bwu_docker/blob/master/lib/src/remote_api.dart#L160-L178

它使用http

import 'package:http/http.dart' as http;
Run Code Online (Sandbox Code Playgroud)

  • 我想到了。关闭文件流的“onDone”上的“sink”解决了问题。 (4认同)