如何使用Phonegap FileTransfer.upload将文件从手机摄像头上传到xPages?

时间:2013-11-01 09:06:27

标签: cordova xpages

任何人都可以使用IBM Domino xPages吗?我在这里读过很多这样的来源 How to get a picture from phonegap to a remote XPage?

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

1 个答案:

答案 0 :(得分: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>

render属性设置为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);
}

}