颤振中的 WSDL 文件上传?
WSDL file upload in flutter?
我对 flutter 还很陌生。我正在寻找一些关于如何正确使用 flutter 的 HHTP 库的指导。
我的挑战是使用 WSDL 服务上传图片。这里有两个代码(flutter 与 Java)使用相同的 WSDL 执行相同的功能。 Java 有效!
我使用这个例子构建我的 flutter 代码:如何在 Flutter 中上传图像。 How to upload image in Flutter?
但是我下面的 flutter 代码 returns 服务器错误 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 库让上面的 flutter 代码工作? HHTP 库是使用 WSDL 的正确库吗?
感谢您的指导。
呆在家里。注意安全!
目前,在 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
},
),
);
如果您需要更多信息,请在评论中告诉我。希望有用。
此代码扩展了上面的 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;
}
我对 flutter 还很陌生。我正在寻找一些关于如何正确使用 flutter 的 HHTP 库的指导。
我的挑战是使用 WSDL 服务上传图片。这里有两个代码(flutter 与 Java)使用相同的 WSDL 执行相同的功能。 Java 有效!
我使用这个例子构建我的 flutter 代码:如何在 Flutter 中上传图像。 How to upload image in Flutter?
但是我下面的 flutter 代码 returns 服务器错误 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 库让上面的 flutter 代码工作? HHTP 库是使用 WSDL 的正确库吗?
感谢您的指导。
呆在家里。注意安全!
目前,在 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
},
),
);
如果您需要更多信息,请在评论中告诉我。希望有用。
此代码扩展了上面的 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;
}