2015-10-15 2 views
0

Я создаю приложение для загрузки файла PDF с внешнего сервера. Я написал следующий код:Загрузить PDF-файл с помощью адаптера MobileFirst

На Backend сервере Ниже приведен метод:

 @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; 

     } 

Я называю этот метод отдыха от моего адаптера, как:

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

После завершения вызова I am получать следующий ответ от этой услуги:

{ 
     "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-файл и показать его пользователю? Кроме того, я получаю этот ответ, когда я правой кнопкой мыши на адаптер и выберите работать как «вызов мобильного адаптера», когда я просто называю этот метод адаптера из приложения, используя следующий код:

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


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

Я получаю тот же ответ на консоль браузера, но мой метод «OnFailure» «downloadFileFAIL» вызывается.

Редактировать Ниже журнал, который выходит напечатанный в браузере консольных:

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

Ниже приведены ссылки на проект и его ресурсы:

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

Где вы тестирования это? настольный браузер или устройство? Не ожидайте, что он будет работать одинаково! Браузер - это не то же самое, что и устройство. В устройстве вы должны обработать ответ с помощью Cordova, получить доступ к файловой системе устройства или сохранить ответ в JSONStore -> где вы храните ответ? HTML5 локальное хранилище? Он имеет только емкость 5 МБ ... вместо этого используйте JSONStore. –

+0

Я использую браузер рабочего стола. Но еще одна вещь заключается в том, что метод успеха не вызывается, даже если ответ в порядке. –

+0

"statusCode": 20 и "statusReason": "OK" ... я что-то упустил? Можете ли вы указать мне на ошибку? –

ответ

3

ОБНОВЛЕНО:

Проблема вы столкнулись, потому что JS не может обрабатывать двоичные данные. Ваш лучший вариант - base64 закодировать файл на вашем серверном сервере, а затем base64 декодировать файл в вашем приложении перед сохранением в файл. Для примера:

Backend Сервер:

Вам потребуется дополнительная зависимость в проекте 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; 
} 
+1

Он действительно решает проблему. Спасибо, Иоэл. –

+0

@PrerakTiwari приветствуются –

Смежные вопросы