Как я могу загрузить PDF-файл с помощью Dart HttpClient?

Мне нужно опубликовать файл PDF в удаленном REST API, и я не могу понять это. Что бы я ни делал, сервер отвечает, что я еще не связал объект с параметром file. Допустим, у меня есть PDF-файл с именем test.pdf. Это то, что я делал до сих пор:

// Using an HttpClientRequest named req

req.headers.contentType = new ContentType('application', 'x-www-form-urlencoded');
StringBuffer sb = new StringBuffer();
String fileData = new File('Test.pdf').readAsStringSync();
sb.write('file=$fileData');
req.write(sb.toString());
return req.close();

До сих пор я пробовал практически все комбинации и кодировки данных, которые я write() в запросе, но безрезультатно. Я пытался отправить его как codeUnits, я пытался кодировать его, используя UTF8.encode, я пытался кодировать его, используя Latin1Codec, все. Я в тупике.

Любая помощь будет принята с благодарностью.


person lucperkins    schedule 24.03.2014    source источник


Ответы (3)


Вы можете использовать MultipartRequest из http://pub.dartlang.org/packages/http:

var uri = Uri.parse("http://pub.dartlang.org/packages/create");
var request = new http.MultipartRequest("POST", url);
request.fields['user'] = '[email protected]';
request.files.add(new http.MultipartFile.fromFile(
    'package',
    new File('build/package.tar.gz'),
    contentType: new ContentType('application', 'x-tar'));
request.send().then((response) {
  if (response.statusCode == 200) print("Uploaded!");
});
person Alexandre Ardhuin    schedule 24.03.2014
comment
Спасибо, это очень полезно! Вы случайно не знаете, как добавить учетные данные в POST с помощью пакета http? Это довольно тривиально, используя стандартную HttpClient, но я не вижу, как это делается с помощью библиотеки http. - person lucperkins; 24.03.2014
comment
Извините, я не знаю. Я думаю, вам нужно вручную добавить хороший Header. - person Alexandre Ardhuin; 24.03.2014
comment
Почему я получаю сообщение об ошибке «.fromFile»? Я что-то упускаю? - person ABM; 21.06.2021

Попробуйте использовать заголовок multipart/form-data, а не x-www-form-urlencoded. Это следует использовать для двоичных данных, также можете ли вы показать свой полный запрос req?

person user2685314    schedule 24.03.2014

  void uploadFile(File file) async {

    // string to uri
    var uri = Uri.parse("enter here upload URL");

    // create multipart request
    var request = new http.MultipartRequest("POST", uri);

    // if you need more parameters to parse, add those like this. i added "user_id". here this "user_id" is a key of the API request
    request.fields["user_id"] = "text";

    // multipart that takes file.. here this "idDocumentOne_1" is a key of the API request
    MultipartFile multipartFile = await http.MultipartFile.fromPath(
          'idDocumentOne_1',
          file.path
    );

    // add file to multipart
    request.files.add(multipartFile);

    // send request to upload file
    await request.send().then((response) async {
      // listen for response
      response.stream.transform(utf8.decoder).listen((value) {
        print(value);
      });

    }).catchError((e) {
      print(e);
    });
  }

Я использовал средство выбора файлов, чтобы выбрать файл. Вот коды для выбора файла.

Future getPdfAndUpload(int position) async {

    File file = await FilePicker.getFile(
      type: FileType.custom,
      allowedExtensions: ['pdf','docx'],
    );

    if(file != null) {

      setState(() {

          file1 = file; //file1 is a global variable which i created
     
      });

    }
  }

здесь file_picker библиотека флаттера.

person Supun Dewapriya    schedule 06.02.2021