通过MobileFirst Adapter下载PDF文件 [英] Download PDF file from through MobileFirst Adapter

查看:100
本文介绍了通过MobileFirst Adapter下载PDF文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个从后端服务器下载PDF文件的应用程序。我写了以下代码:

I am building an application to download the PDF file from out back-end server. I have written following code:

在Backend Server上,以下是方法:

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;

        }

我从我的适配器调用这个rest方法: / p>

I am calling this rest method from my adapter as:

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.
    }

如何将此响应解析为PDF文件并将其显示给用户?当我右键单击适配器并选择以调用移动适配器运行时,当我只是使用以下代码从应用程序调用此适配器方法时,我得到此响应:

How can I parse this response to a PDF file and show it to the user? 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
    });

我在浏览器的控制台上收到相同的响应,但我的OnFailure方法downloadFileFAIL正在获取叫做。

I am getting the same response on the browser's console but my "OnFailure" method "downloadFileFAIL" is getting called.

编辑
以下是在浏览器COnsole中打印的日志:

Edit Following is the log which is getting printed in Browser 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

以下是项目及其资源的链接:

Following are the links to the project and its resources:


  1. Java文件

  2. PDF文件

  3. MF项目

  1. Java File
  2. PDF File
  3. MF Project


推荐答案

更新:

您遇到的问题是因为JS无法处理二进制数据。您最好的选择是在后端服务器上对文件进行base64编码,然后在保存到文件之前对应用程序中的文件进行base64解码。例如:

The problem you are facing is because JS cannot handle binary data. 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. For Example:

后端服务器:

您需要一个额外的依赖项你的项目 import org.apache.commons.codec.binary.Base64;

You will need an additional dependency in your project 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;
}

这篇关于通过MobileFirst Adapter下载PDF文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆