将文件作为 base64 传递给 Primefaces 的远程命令



我在客户端有一个File对象数组,我试图将该文件的b64值发送到托管bean。

HTML:

<p:remoteCommand name="convertToPdfa" actionListener="#{bean.convertFile}" />

Bean方法:

public String convertFile() {
String index = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("index"); // not empty
String data = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("data"); // not empty
String retry = Boolean.parseBoolean(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("retry")); // empty
return "";
}
Javascript:

convertAll: async function (noOfFiles) {
for (let i = 0; i < noOfFiles; i++) {
await sendFileDataAndConvert(i);
}
},
sendFileDataAndConvert: async function (index) {
let promise = new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(getFile(index));
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
// wait until the promise returns us a value
let result = await promise;
// "Now it's done!"
console.log(result); // result is not empty, file is converted
convertToPdfa([{name: 'index', value: index}, {name: 'data', result}, {name: 'retry', value: false}]);
}

现在,因为我使用async函数将File转换为base64,所以在调用远程命令之前,我需要等待结果可用。我猜传递给远程命令的参数是在结果可用之前设置的?在结果可用之前是否调用了远程命令?因为当我尝试在托管bean方法中读取参数时,data是空的,但其他两个参数不是空的。我不太明白这是怎么回事。我正试图等待使用async/await机制的结果,但看起来我错过了一些东西。

如何实现异步功能完成后远程命令参数设置?

刚刚发现是打字错误。而不是

convertToPdfa([{name: 'index', value: index}, {name: 'data', result}, {name: 'retry', value: false}]);

应该是

convertToPdfa([{name: 'index', value: index}, {name: 'data', value: result}, {name: 'retry', value: false}]);

最新更新