[英]IBM Mobilefirst JAVA adapter: Accessing an JSON file and read contents from it
[英]Download PDF file from through MobileFirst Adapter
我正在構建一個應用程序,以從后端服務器下載PDF文件。 我寫了以下代碼:
在后端服務器上,方法如下:
@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方法為:
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;
}
通話結束后,我從該服務獲得以下響應:
{
"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”。
編輯以下是正在瀏覽器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
編輯2
以下是該項目及其資源的鏈接:
更新:
您面臨的問題是因為JS無法處理二進制數據。 最好的選擇是對base64后端服務器上的文件進行編碼,然后對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.