如何通过XPage Java Bean上传和保存附件

我了解如何使用表达式语言将XPages控件绑定到Java Bean。 然后它会自动访问setter和getter。

但是你如何处理文件附件?

那是什么样的? 我希望能够将文件上传控件绑定到bean。 将附件保存到“无论”文档中……无论是当前文档还是外部文档…… bean应该能够处理该逻辑。

我想我不知道如何将该文件附件放入内存bean中,以便能够像保存到文档那样对其进行任何操作。

任何意见,将不胜感激。

更新:这是一个类似的问题: 如何使用xPages上传控件将上传的文件存储到本地文件系统?

但在该问题中,用户想要保存到本地光盘。 我想保存到文档。

谢谢!

您需要使用com.ibm.xsp.component.UIFileuploadEx.UploadedFile类在bean中创建getter和setter:

private UploadedFile uploadedFile; public UploadedFile getFileUpload() { return uploadedFile; } public void setFileUpload( UploadedFile to ) { this.uploadedFile = to; } 

在处理bean数据的函数(例如保存函数)中,您可以通过检查对象是否为空来检查文件是否已上载。 如果它不为null,则上载文件。

要处理上载的文件,首先使用getServerFile()方法获取com.ibm.xsp.http.IUploadedFile对象的实例。 该对象具有getServerFile()方法,该方法返回上载文件的File对象。 该对象的问题在于它具有一个神秘的名称(可能是为了处理多个人同时上传具有相同名称的文件)。 可以使用IUploadedFile类的getClientFileName()方法检索原始文件名。

我接下来要做的是将隐秘文件重命名为其原始文件名,处理它(将其嵌入富文本字段或使用它执行其他操作),然后将其重命名为其原始(隐藏)名称。 最后一步很重要,因为只有在代码完成后才清理(删除)文件。

以下是上述步骤的示例代码:

 import java.io.File; import com.ibm.xsp.component.UIFileuploadEx.UploadedFile; import com.ibm.xsp.http.IUploadedFile; import lotus.domino.Database; import lotus.domino.Document; import lotus.domino.RichTextItem; import com.ibm.xsp.extlib.util.ExtLibUtil; //only used here to get the current db public void saveMyBean() { if (uploadedFile != null ) { //get the uploaded file IUploadedFile iUploadedFile = uploadedFile.getUploadedFile(); //get the server file (with a cryptic filename) File serverFile = iUploadedFile.getServerFile(); //get the original filename String fileName = iUploadedFile.getClientFileName(); File correctedFile = new File( serverFile.getParentFile().getAbsolutePath() + File.separator + fileName ); //rename the file to its original name boolean success = serverFile.renameTo(correctedFile); if (success) { //do whatever you want here with correctedFile //example of how to embed it in a document: Database dbCurrent = ExtLibUtil.getCurrentDatabase(); Document doc = dbCurrent.createDocument(); RichTextItem rtFiles = doc.createRichTextItem("files"); rtFiles.embedObject(lotus.domino.EmbeddedObject.EMBED_ATTACHMENT, "", correctedFile.getAbsolutePath(), null); doc.save(); rtFiles.recycle(); doc.recycle(); //if we're done: rename it back to the original filename, so it gets cleaned up by the server correctedFile.renameTo( iUploadedFile.getServerFile() ); } } } 

我有用Java处理上传文件的代码。 使用普通的fileUpload控件上传文件,然后从一个按钮调用以下Java代码(执行完全刷新 – 以便保存包含上载文件的文档)。 在Java代码中,您可以执行任何所需的检查(文件名,文件大小等):

 public void importFile() { facesContext = FacesContext.getCurrentInstance(); ExternalContext externalContext = facesContext.getExternalContext(); // get a handle an the uploaded file HttpServletRequest request = (HttpServletRequest) externalContext.getRequest(); String fileUploadID = JSFUtil.findComponent("uploadFile").getClientId(FacesContext.getCurrentInstance()); UploadedFile uploadedFile = ((UploadedFile) request.getParameterMap().get(fileUploadID)); if (uploadedFile == null) { facesContext.addMessage("messages1", new FacesMessage(FacesMessage.SEVERITY_ERROR, "No file uploaded. Use the file upload button to upload a file.", "")); return; } File file = uploadedFile.getServerFile(); String fileName = uploadedFile.getClientFileName(); // Check that filename ends with .txt if (!fileName.endsWith(".txt")) { facesContext.addMessage("messages1", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error in uploaded file. The file must end with .txt", "")); return; } try { // Open the file BufferedReader br; br = new BufferedReader(new FileReader(file)); String strLine; // Read File Line By Line while ((strLine = br.readLine()) != null) { // do stuff with the contents of the file } // Close the input stream br.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { facesContext.addMessage("messages1", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error in uploaded file. Please check format of file and try again", "")); return; } facesContext.addMessage("messages1", new FacesMessage(FacesMessage.SEVERITY_INFO, "File successfully uploaded", "")); } 

使用文件对象的句柄,您可以使用embedObject将文件存储在其他文档中。