0

有人可以使用 IBM Domino xPages 吗?我在这里阅读了很多类似这样的资源 如何从 phonegap 获取图片到远程 XPage?

...但仍然无法正常工作。当我将其上传到常见的 LN url 例如 /my_app.nsf/upload?CreateDocument 时,我将图像文件作为富文本字段中的文本获取,甚至被截断。但是当使用文件上传控件上传到 xPages 应用程序时,我无法获取文件。它与此控件无关。有谁成功过这个?

4

1 回答 1

3

FileTransfer API 的 upload() 方法对目标位置执行多部分 POST。您应该能够使用 XPage 来处理它。我还没有使用 PhoneGap 完成它,但是使用了其他各种文件上传器。它需要两件事:作为上传文件的接收目标的 XPage 和处理它的 Java 类。

XPage 很简单,看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="false">

 <xp:this.beforePageLoad>
   <![CDATA[#{javascript:eu.linqed.UploadHandler.process();}]]>   
 </xp:this.beforePageLoad>

</xp:view>

渲染属性设置为 false,因此它不输出任何内容(我们可以在 Java 类中处理它)。我们也不需要文件上传控件:上传的文件直接从请求中读取。

Java 类可能如下所示:

package eu.linqed;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import lotus.domino.*;
import com.ibm.xsp.http.UploadedFile;
import com.ibm.xsp.webapp.XspHttpServletResponse;

public class UploadHandler {

private static String FILE_PARAM = "uploadedFile"; // name of the multipart
                                                    // POST param that holds
                                                    // the uploaded file
private static String RT_ITEM_NAME_FILES = "file"; // name of the RT item
                                                    // that will hold the
                                                    // uploaded file

public UploadHandler() {
}

@SuppressWarnings("unchecked")
public static void process() {

    XspHttpServletResponse response = null;
    PrintWriter pw = null;

    UploadedFile uploadedFile = null;
    File correctedFile = null;

    RichTextItem rtFiles = null;
    Document doc = null;

    String fileName = "";

    FacesContext facesContext = FacesContext.getCurrentInstance();

    try {

        ExternalContext extCon = facesContext.getExternalContext();
        response = (XspHttpServletResponse) extCon.getResponse();
        pw = response.getWriter();

        //only HTTP POST is allowed
        HttpServletRequest request = (HttpServletRequest) extCon.getRequest();
        if (!request.getMethod().equalsIgnoreCase("post")) {
            throw (new Exception("only POST is allowed"));
        }

        Database dbCurrent = (Database) resolveVariable("database");

        //set up output object
        response.setContentType("text/plain");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", -1);

        //check if we have a file in the POST
        Map map = request.getParameterMap();

        if (!map.containsKey(FILE_PARAM)) {
            throw (new Exception("no file received"));
        }

        //get the file from the request
        uploadedFile = (UploadedFile) map.get(FILE_PARAM);

        if (uploadedFile == null) {
            throw (new Exception("that's not a file!"));
        }

        //store file in a document
        fileName = uploadedFile.getClientFileName();   //original name of the file

        File tempFile = uploadedFile.getServerFile(); // the uploaded file with a cryptic name

        //we rename the file to its original name, so we can attach it with that name
        //see http://www.bleedyellow.com/blogs/m.leusink/entry/processing_files_uploaded_to_an_xpage?lang=nl
        correctedFile = new java.io.File(tempFile.getParentFile().getAbsolutePath() + java.io.File.separator + fileName);
        boolean renamed = tempFile.renameTo(correctedFile);

        if (renamed) {

            //create a document in the current db
            doc = dbCurrent.createDocument();
            doc.replaceItemValue("form", "fFile");

            //attach file to target document
            rtFiles = doc.createRichTextItem(RT_ITEM_NAME_FILES);
            rtFiles.embedObject(lotus.domino.EmbeddedObject.EMBED_ATTACHMENT, "", correctedFile.getAbsolutePath(), null);

            boolean saved = doc.save();

        }

        pw.print("add code to return to the upload method here");

        response.commitResponse();

    } catch (Exception e) {

        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

        pw.print("add code here to return an error");

        try {
            response.commitResponse();
        } catch (IOException e1) {
            e1.printStackTrace();
        }

    } finally {

        facesContext.responseComplete();

        try {

            if (rtFiles != null) {
                rtFiles.recycle();
            }
            if (doc != null) {
                doc.recycle();
            }

            if (correctedFile != null) {
                // rename temporary file back to its original name so it's
                // automatically
                // deleted by the XPages engine
                correctedFile.renameTo(uploadedFile.getServerFile());
            }
        } catch (Exception ee) {
            ee.printStackTrace();
        }

    }
}

private static Object resolveVariable(String variableName) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    return facesContext.getApplication().getVariableResolver().resolveVariable(facesContext, variableName);
}

}
于 2013-11-02T07:03:14.880 回答