【问题标题】:WSDL file upload in flutter?WSDL 文件在颤动中上传?
【发布时间】:2020-07-28 23:02:21
【问题描述】:

我对 Flutter 还很陌生。我正在寻找一些关于如何正确使用 Flutter 的 HHTP 库的指导。

我的挑战是使用 WSDL 服务来上传图片。下面是两个代码(flutter 与 Java),它们使用相同的 WSDL 执行相同的功能。 Java 有效!

我使用以下示例构建了我的 Flutter 代码:如何在 Flutter 中上传图像。 How to upload image in 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;
 }
}

这是一个使用相同 WSDL 的 Java 代码示例:

    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 的正确库吗?

感谢您的指导。
呆在家里。注意安全!

【问题讨论】:

    标签: file http flutter upload httpurlconnection


    【解决方案1】:

    目前,在 Dart 中,您使用的是多部分请求,而在 Java 中,您正在发送流。我建议也尝试发送流。尝试使用出色的 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
        },
      ),
    );
    

    如果您在 cmets 中需要更多内容,请告诉我。希望它有效。

    【讨论】:

    • 我假设图片数据进入 List postData = [...]; 的定义我如何做到这一点?
    • 我认为是这样的: List fileBytes = await file.readAsBytes();
    • 您缺少压缩图像的代码,可能是为了降低分辨率。
    • 问题出在请求而不是图像上。
    • 嗨洛伦佐,感谢您的帮助和快速回复。从概念上讲,您上面的答案很好。但就像理查德提到的那样,代码是不完整的。但我得到了它的工作。我将很快发布一个完整的代码示例。确实给了我研究 DIO 库的想法。我还使用 http.MultipartRequest 库让它工作。我试图找出 HTTP 与 DIO 库哪个最好、哪个更快。
    【解决方案2】:

    此代码扩展了上面的 Lorenzo 答案。此代码对我有用,希望对其他人有所帮助。

        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;
        }
    

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 2022-08-10
      • 2019-07-14
      • 2021-08-12
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      相关资源
      最近更新 更多