在Dart中处理图像



我目前正在尝试处理由用户上传的服务器上的图像。我的目标是把这张上传的图片,在服务器上处理,然后上传到rackspace云文件。我没能找到办法。我希望有人能引导我到正确的方向。

以下是我目前在服务器端处理 的内容
Future < Null > handleUploadRequest(final HttpRequest httpRequest) async {
  print('handle upload -------------------------');
  var data;
  await httpRequest.fold(new BytesBuilder(), (b, d) => b..add(d)).then((builder) {
    data = builder.takeBytes();
    String encodedData = JSON.encode(data);
    int dataLength = encodedData.length;
    // Uploading image to rackspace cloud files
   // Here we have to send a request with username & api key to get an auth token
http.post(tokens, headers : {'Content-Type':'application/json'}, body: JSON.encode({"auth": {"RAX-KSKEY:apiKeyCredentials":{"username":"XXXXXXXXXXXXXXX","apiKey":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}}})).then((response) {
   print("Response status: ${response.statusCode}");
   print("Response body: ${response.body}");
   return response;
}).then((response){
   authResponse = JSON.decode(response.body);
   String token = authResponse['access']['token']['id'];

/////////// This is where we upload the image to Rackspace ///////
  var request = new http.MultipartRequest("PUT", Uri.parse('https://storage101.iad3.clouddrive.com/v1/MossoCloudFS_XXXXXXX/TestContainer/testimage.jpg'));
  request.headers['X-Auth-Token'] = token;
  request.headers['Content-Type'] = 'image/jpeg';
  var stream = new http.ByteStream.fromBytes(data);
  request.files.add(new http.MultipartFile('file', stream, data.length, filename: 'testfile.jpg', contentType: 'image/jpeg');
  print('requesT: ${request}');
  request.send().then((response) {
   print(response.statusCode);
   print(response.headers);
   print(response.stream);
   if (response.statusCode == 200) print("Uploaded!");
  });

//// End of Upload to Rackspace //////////
    print('Upload Complete!');
    httpRequest.response.write(data);
    await httpRequest.response.close();
}

现在唯一的问题是,在https://pub.dartlang.org/packages/http中,我需要在参数content-type中调用MediaType类型。我不知道该怎么说。它看起来像是一个类中的工厂?如果我不调用内容类型,那么它默认为octet-stream,不能从cdn存储容器打开。

关于这种上传方式的参考来自我如何使用Dart's HttpClient上传PDF ?

看起来像http.put(...)httpRequest.response.close();前面缺失的return

在每个异步调用(调用返回Future的函数)之前使用await或将每个这样的Future返回给调用者以保持执行顺序。如果没有这些,异步执行将被安排在稍后执行,而下一行代码将在您调用的异步代码开始之前执行。

更新纯async/await实现

import 'package:http/http.dart' as http;
import 'dart:async' show Future, Stream;
import 'dart:io';
Future<Null> handleUploadRequest(final HttpRequest httpRequest) async {
  print('handle upload -------------------------');
  print('httpRequest: ${httpRequest.headers}');
  var data;
  var builder = await httpRequest.fold(new BytesBuilder(), (b, d) => b..add(d));
  data = builder.takeBytes();
  print('bytes builder: ${data}');
  // Uploading image to rackspace cloud files
  var url =
      'https://storage101.dfw1.clouddrive.com/v1/{accountnumber}/{container}/';
  var response = await http.put(url,
      headers: {
        'X-Auth-Token': '{XXXXXXXXXAPI_KEYXXXXXXXXXX}',
        'Content-Type': 'image/jpeg',
        'Content-Length': '${httpRequest.headers.contentLength}',
      },
      body: data);
  print("Response status: ${response.statusCode}");
  print("Response body: ${response.body}");
  print('closing connection with data complete');
  httpRequest.response.write(data);
  await httpRequest.response.close();
}

相关内容

  • 没有找到相关文章

最新更新