【发布时间】:2019-08-27 10:15:23
【问题描述】:
我想用 Java 编写程序,使用 Selenium 和 executeAsyncScript() 函数将文件上传到服务器。当我手动上传文件时,Google Chrome DevTools 中的请求如下所示:Google Chrome Request
在我的代码中,我有这样的片段,但它不起作用。代码如下:
private void uploadFilesByRest(JSONObject operat) {
if (operat != null) {
List<Document> documentsToUpload = config.getOrder().getDocument();
for (Document document : documentsToUpload) {
Path pdfPath = Paths.get(document.getPathToFile());
try {
byte[] pdfByteArray = Files.readAllBytes(pdfPath);
sendPdf(jsEngine, pdfByteArray);
} catch (Exception exc) {
System.out.println(exc.getMessage());
LOGGER.error("Wystąpił błąd podczas konwersji pliku pdf na tablicę bajtów");
System.out.println("Wystąpił błąd podczas konwersji pliku pdf na tablicę bajtów");
}
}
} else {
LOGGER.error("Operat przekazany jako argument do funkcji ładującej pliki do dokumentów składowych ma wartość NULL");
System.out.println("Operat przekazany jako argument do funkcji ładującej pliki do dokumentów składowych ma wartość NULL");
}
}
public static JSONObject sendPdf(JavascriptExecutor jsEngine, byte[] pdfBlob) {
Object rsult = jsEngine.executeAsyncScript(
" var callback = arguments[arguments.length - 1];\n" +
"var blob = new Blob([" + pdfBlob + "], {type : 'application/pdf'}); \n" +
"var formData = new FormData();\n" +
"\n" +
"formData.append('NazwaPliku', 'obl_001_P.2413.2001.12.pdf');\n" +
"formData.append('RodzajOpracowaniaDokumentu', '100065');\n" +
"formData.append('OwnerId', '54448');\n" +
"formData.append('Owner', 'szkice');\n" +
"formData.append('Plik', blob);\n" +
"formData.append('files', blob);\n" +
"\n" +
"fetch('https://gis.tarnogorski.pl//api/archiwista/dokument/dodaj', {\n" +
"method: 'post',\n" +
" headers: {\n" +
"'Content-type': 'multipart/form-data',\n" +
"}, \n" +
"body: formData \n" +
" })\n" +
".then(res => res.text())\n" +
".then(res => {\n" +
"console.log('pobrane dane:');\n" +
"console.log(res);\n" +
"callback(res);\n" +
"}).catch(error => console.log('Błąd: ', error));"
);
JSONObject json = new JSONObject();
json.put("data", rsult);
return json;
}
我的问题是我应该如何设置从 Java 到 JS 的字节数组以及如何正确创建 FormData(在 Google Chrome DevTools 中是 multipart/form-data)?现在我的函数返回错误“org.openqa.selenium.JavascriptException:SyntaxError:非法字符”。感谢您的帮助。
【问题讨论】:
-
您在这里使用 Selenium 会使事情复杂化。似乎您应该只使用 Java 来发送表单数据/标题。
-
也许可以试试 atob 和 btoa 的 java 等价物。
标签: javascript java selenium