2

現在、ユーザーがアップロードしたサーバー上の画像を処理しようとしています。私の目標は、アップロードされたこの画像を取得し、サーバーで処理してから、ラックスペースのクラウド ファイルにアップロードすることです。私は道を見つけるのに運がありませんでした。誰かが私を正しい方向に導いてくれることを願っています。

処理のためにサーバー側でこれまでに持っているものは次のとおりです

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 を呼び出す必要があることです。これの呼び方がわかりません。クラス内の工場のようですか?content-type を呼び出さない場合、デフォルトで octet-stream になり、cdn ストレージ コンテナーから開くことはできません。

このアップロード方法への参照は、Dart の HttpClient を使用して PDF をアップロードするにはどうすればよいですか?からです。

4

1 に答える 1

1

行方不明のように見えreturnますhttp.put(...)httpRequest.response.close();

await各非同期呼び出し (Future を返す関数の呼び出し) の前に使用するか、そのような各 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();
}
于 2015-08-17T05:14:06.270 に答える