Загрузка файла WSDL во флаттер? - PullRequest
0 голосов
/ 15 апреля 2020

Я довольно новичок, чтобы трепетать. Я ищу несколько советов о том, как правильно использовать библиотеку HHTP flutter.

Моя задача - использовать WSDL-сервис для загрузки изображения. Вот два кода (флаттер против Java), которые выполняют одну и ту же функцию с одним и тем же WSDL. Java работает!

Я строю свой код флаттера, используя этот пример: Как загрузить изображение во флаттер. Как загрузить изображение в Flutter?

Но мой код флаттера ниже возвращает ошибку сервера 500: См. Снимки экрана ниже для справки и ясности.

Future<bool> sentPhotoTransaction () async {
 // URL includes two parameter plus the image file stream.
 String cIPhotoPath = "/storage/emulated/0/Android/data/com.saleson24.saleson24/files/Pictures/scaled_IMG_20200414_161101.jpg";
 String urlString = "http://pro.test.com/ImgHandler.WCFHost/FileManagerService.svc/UploadFile?MobID=20A47616&Sig=b6e61d4e3ee38";
Io.File imageFile;
 imageFile = new Io.File(cIPhotoPath);
 // ***************** create multipart request for POST *****************
 var request = http.MultipartRequest("POST", Uri.parse(urlString));
 // ***************** create multipart using filepath, string or bytes *****************
 var picture = await http.MultipartFile.fromPath("stream", imageFile.path);
 // ***************** add multipart for the picture to request *****************
 request.files.add(picture);
 try {
   var response = await request.send();
   if (response.statusCode == 200) {
     print("Success");
     return true;
   } else {
     print("POST request did not worked");
     return false;
   }
 } catch(e) {
   print(e.toString());
   return false;
 }
}

enter image description here enter image description here

Вот пример кода Java, который работал с тем же WSDL:

    java.net.URL url = new URL(urlString);
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    urlConnection.setDoOutput(true);    //Allow Outputs
    urlConnection.setUseCaches(false);  //Don't use a cached Copy
    urlConnection.setRequestMethod("POST");
    Bitmap full_image = BitmapFactory.decodeFile(filepath);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    full_image.compress(Bitmap.CompressFormat.JPEG, IMAGE_QUALITY, stream); // Convert stream.
    byte[] byteArray = stream.toByteArray();
    DataOutputStream dos = new DataOutputStream(urlConnection.getOutputStream());
    dos.write(byteArray);
    dos.flush();
    dos.close();                 // END POST

Как получить трепетать код выше, используя библиотеку HTTP выше, чтобы работать? Является ли библиотека HHTP правильной библиотекой для использования WSDL?

Ваше руководство приветствуется.
Stay @ home. Будь в безопасности!

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

В Dart в данный момент вы используете многочастный запрос, в Java вы отправляете поток. Предлагаю попробовать отправить поток тоже. Попробуйте сделать это, используя библиотеку fantasti c dio .

Там есть пример для отправки:

// Binary data
List<int> postData = <int>[...];
await dio.post(
  url,
  data: Stream.fromIterable(postData.map((e) => [e])), //create a Stream<List<int>>
  options: Options(
    headers: {
      Headers.contentLengthHeader: postData.length, // set content-length
    },
  ),
);

Дайте мне знать, если вы нужно что-то еще в комментариях. Надеюсь, что это работает.

0 голосов
/ 17 апреля 2020

Этот код расширяет ответ Лоренцо выше. Этот код работал для меня, надеюсь, что это помогает другим. Оставайтесь в безопасности! Спасибо Лоренцо и Ричарду.

    String photoPath = "";      // Your photo location path.
    Io.File file = new Io.File(photoPath);
    var dio = Dio();
    // ***************** Transfer File *****************
    try {
// Convert file to Bytes WITHOUT compression.
//          List<int> postData = await file.readAsBytes();                      
// Convert file to Bytes WITH compression.
          List<int> postData = await compressImageFileAndReturnList(file);      
      var response = await dio.post(urlString,
          data: Stream.fromIterable(postData.map((e) => [e])),
          options: Options(
              followRedirects: false,
              headers: {
                Headers.contentLengthHeader: postData.length, // set content-length
              }
          )
      );
      if (response.statusCode == 200) {
        print("Success");
        return true;
      } else {
        print("POST request did not worked");
        return false;
      }
    } catch(e) {
      print(e.toString());
      return false;
    }
...