2015-08-17 2 views
2

В настоящее время я пытаюсь обработать изображение на сервере, которое было загружено пользователем. Моя цель - загрузить это изображение, которое было загружено, обработать его на сервере, а затем загрузить в облачные файлы rackspace. Мне не повезло найти способ. Я надеюсь, что кто-то может привести меня в правильное направление.Обработка изображения в Dart

Вот что я до сих пор на стороне сервера для обработки

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, мне нужно позвонить типа MEDIATYPE в параметре типа содержимого. Я понятия не имею, как это назвать. Кажется, это фабрика внутри класса? Если я не вызываю тип содержимого, то по умолчанию используется октет-поток, который нельзя открыть из контейнера хранения cdn.

Ссылка на этот способ загрузки от How can I upload a PDF using Dart's HttpClient?

+1

ли мои предложения приводят к различному поведению? Не могли бы вы изменить свой вопрос и добавить вывод ошибки непосредственно в свой вопрос. Существует ссылка на редактирование ниже тега [dart] и [dart-async]. –

+0

Возвращение до http.put (..) не позволит запустить. он печатает байты, которые он читает, и переходит в .then ((_). –

+1

Я добавил в мой ответ чистую реализацию 'async' /' await', я думаю, что легче рассуждать об этом. Можете ли вы попробовать и сказать если он работает лучше/хуже/то же? –

ответ

1

выглядит как отсутствующий return перед http.put(...) и httpRequest.response.close();

Либо вы используете await перед каждым асинхронном вызове (вызов функций, возвращающих будущее) или вернуться каждый такое Будущее для вызывающего абонента, чтобы сохранить порядок исполнения. Без каких-либо из них выполнение async запланировано для последующего выполнения, а следующая строка вашего кода будет выполнена до того, как вы выйдете даже после вызова асинхронного кода.

Update чисто асинхронном/ждут реализации

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(); 
} 
+0

Я получаю 'SocketException: Write failed, address = storage101.dfw1.clouddrive.com, port = 62429' Когда обновлено. Это намного лучше, чем то, что у меня было раньше (что было необработанным исключение). Спасибо за это :). Теперь мне нужно выяснить, почему я получаю проблему SocketException. –

+1

Я сам не использовал cloudfiles, но, глядя на документацию, которую я нашел, вам может потребоваться добавить имя объекта в дополнение к учетной записи и контейнеру. –

+0

Когда я использовал их службу в последний раз для php, у них был простой sdk, который мне просто нужно было импортировать, поэтому для меня это совсем другое. love dart, хотя –

Смежные вопросы