简体   繁体   English

通过MobileFirst Adapter下载PDF文件

[英]Download PDF file from through MobileFirst Adapter

I am building an application to download the PDF file from out back-end server. 我正在构建一个应用程序,以从后端服务器下载PDF文件。 I have written following code: 我写了以下代码:

On Backend Server, following is the method: 在后端服务器上,方法如下:

        @POST
        @Consumes(MediaType.APPLICATION_JSON)
        @Produces("application/pdf")
        public Response download() {
                ResponseBuilder response = Response.ok((Object) new File("myFile.pdf"));
                response.header("Content-Disposition", "attachment; filename=myFile.pdf");
                Response responseBuilder = response.build();
                return responseBuilder;

        }

I am calling this rest method from my adapter as: 我从我的适配器调用此rest方法为:

function downloadFile(){
            var input = {
                    method              : 'post',
                    returnedContentType : "plain",
                    path                : "getfiles",
                    body                : {
                        contentType : 'application/json;charset=utf-8',
                        content     : JSON.stringify({username: "testuser"})
                    }

            };
            var response = WL.Server.invokeHttp(input);
            return response;
}

After the call Is finished I am getting following response from this service: 通话结束后,我从该服务获得以下响应:

    {
       "errors": [
       ],
       "info": [
       ],
       "isSuccessful": true,
       "responseHeaders": {
          "Content-Disposition": "attachment; filename=myFile.pdf",
          "Content-Length": "692204",
          "Content-Type": "application\/pdf",
          "Date": "Thu, 15 Oct 2015 15:19:56 GMT",
          "X-Powered-By": "Servlet\/3.0"
       },
       "responseTime": 11,
       "statusCode": 200,
       "statusReason": "OK",
       "text":"%PDF-1.6\n%����\n159 0 obj\n<<\/Linearized 1\/L 692204\/O 162\/E 156949\/N 25\/T 691602\/H [ 531 579]>>\nendobj\n"
--long lines of characters in text field.
    }

How can I parse this response to a PDF file and show it to the user? 我如何解析此响应为PDF文件并将其显示给用户? Also I am getting this response when I right click on adapter and choose run as "call mobile adapter", when I simply call this adapter method from the application using following code: 当我使用以下代码从应用程序中简单地调用此适配器方法时,当我右键单击适配器并选择运行为“调用移动适配器”时,也会收到此响应:

    var invocationData = {
            adapter : "MyAdapter",
            procedure: "downloadFile",
            parameters: []
    };


    WL.Client.invokeProcedure(invocationData, {
        onSuccess: downloadFileOK, 
        onFailure: downloadFileFAIL,
        onConnectionFailure: disconnectDetect
    });

I am getting the same response on the browser's console but my "OnFailure" method "downloadFileFAIL" is getting called. 我在浏览器的控制台上得到了相同的响应,但是正在调用“ OnFailure”方法“ downloadFileFAIL”。

Edit Following is the log which is getting printed in Browser COnsole: 编辑以下是正在浏览器COnsole中打印的日志:

R\n>>\nstartxref\n451945\n%%EOF","errors":[],"isSuccessful":true,"statusReason":"OK","responseHeaders":{"Date":"Thu, 15 Oct 2015 21:52:40 GMT","Content-Length":"453132","Content-Disposition":"attachment; filename=myFile.pdf","Content-Type":"application\/pdf","X-Powered-By":"Servlet\/3.0"},"warnings":[],"responseTime":15,"totalTime":151,"info":[]}
worklight.js:5356 Procedure invocation error.WL.Logger.__log @ worklight.js:5356
worklight.js:5360 Uncaught Exception: Uncaught SyntaxError: Unexpected number at (compiled_code):3879WL.Logger.__log @ worklight.js:5360
worklight.js:3879 Uncaught SyntaxError: Unexpected number
worklight.js:5992 Local storage capacity reached. WL.Logger will delete old logs to make room for new ones.
worklight.js:5356 Piggybacking event transmission
worklight.js:5356 Flush called

Edit2 编辑2

Following are the links to the project and its resources: 以下是该项目及其资源的链接:

  1. Java File Java文件
  2. PDF File PDF文件
  3. MF Project MF项目

UPDATED: 更新:

The problem you are facing is because JS cannot handle binary data. 您面临的问题是因为JS无法处理二进制数据。 Your best option is to base64 encode the file on your backend server and then base64 decode the file on your app before saving to a file. 最好的选择是对base64后端服务器上的文件进行编码,然后对base64上的文件进行解码,然后再保存到文件中。 For Example: 例如:

Backend Server: 后端服务器:

You will need an additional dependency in your project import org.apache.commons.codec.binary.Base64; 在项目import org.apache.commons.codec.binary.Base64;您将需要一个额外的依赖项import org.apache.commons.codec.binary.Base64;

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces("application/pdf")
public Response downloads() throws IOException {

    File file = new File("myFile.pdf");

    InputStream fileStream = new FileInputStream(file);

    byte[] data = new byte[1024];

    ByteArrayOutputStream buffer = new ByteArrayOutputStream();

    int read = 0;
    while ((read = fileStream.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, read);
    }

    buffer.flush();

    fileStream.close();

    ResponseBuilder response = Response.ok(Base64.encodeBase64(buffer.toByteArray()));
    response.header("Content-Disposition", "attachment; filename=myFile.pdf");
    Response responseBuilder = response.build();
    return responseBuilder;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM