且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-01-12 18:24:51

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

You need to create a getter and setter in the bean using the com.ibm.xsp.component.UIFileuploadEx.UploadedFile class:

private UploadedFile uploadedFile;

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

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

In the function that processes the bean data (e.g. a save function) you can check if a file was uploaded by checking if the object is null. If it's not null, a file was uploaded.

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

To process that uploaded file, first get an instance of a com.ibm.xsp.http.IUploadedFile object using the getServerFile() method. That object has a getServerFile() method that returns a File object for the uploaded file. The problem with that object is that it has a cryptic name (probably to deal with multiple people uploading files with the same name at the same time). The original file name can be retrieved using the getClientFileName() method of the IUploadedFile class.

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

What I then tend to do is to rename the cryptic file to its original file name, process it (embed it in a rich text field or do something else with it) and then rename it back to its original (cryptic) name. This last step is important because only then the file is cleaned up (deleted) after the code is finished.

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

Here's the sample code for the steps above:

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


    }
 }