Accept application/pdf in Ext.Ajax.request

馋奶兔 提交于 2019-12-13 18:59:15

问题


I am using Ext.Ajax.request() to make an API call which produces MediaType.MULTIPART_FORM_DATA. This is being handled in the php layer which returns the object in

header("Content-Type: application/pdf"); echo $response;

The problem is, I am not able to handle the received object in the Ext.Ajax.request() since it always handles only Json objects by default.

I tried giving Headers, AcceptType in the request, but it always goes to the failure block.

Here is the code:

Ext.Ajax.useDefaultXhrHeader = false;
var responseText;
Ext.Ajax.request({
    url: '/index.php/abc/xyz?value=' + value,
    method: 'GET',
    waitMsg: 'Printing Label',
    contentType: 'application/octet-stream' //not sure,
    responseType: 'blob' //not sure,
    xhr2: false //not sure,
    success: function (response) {
        console.log("Success!!");
        return "";
    },
    failure: function (response) {
        //Always comes here. The API returns 200
        console.log("Hi here in the error");
        //Raw pdf gets printed
        console.log(response.responseText);
    }
});

回答1:


but it always goes to the failure

For this you need to check in php side because may be something you have missed. I think may be this will help you readfile

Try with this code. Hope this will help/guide you to get required result.

Ext.Ajax.request({
    url: '/index.php/abc/xyz?value=' + value,
    method: 'GET',
    waitMsg: 'Printing Label',
    cors: true,
    useDefaultXhrHeader: false,
    withCredentials: true,
    defaultHeaders: {
        'Content-Type': 'application/octet-stream;'
    },
    timeout:0,//If don't know how time will take server to get the file then you can put 0. if you need 
    success: function(response) {
        //In response you will directly get the octet-stream

        //For showing pdf in front end side using blob url
        var byteCharacters = atob(response.responseText),
            len = byteCharacters.length,
            byteNumbers = new Array(len),
            key = 0,
            byteArray,
            blob,
            contentType = 'application/pdf';

        //insert charcter code in {byteNumbers}
        for (; key < len; key++) {
            byteNumbers[key] = byteCharacters.charCodeAt(key);
        }
        //convert {byteNumbers} into Uint8Array
        byteArray = new Uint8Array(byteNumbers);
        //create blob using {byteArray}
        blob = new Blob([byteArray], {
            type: contentType
        });
        // set {src} to {iframe}
        window.open(window.URL.createObjectURL(blob), '_blank');
    },
    failure: function(response) {
        //if somthing wrong in serverside then it will come in failure.
    }
});

Hope this will also help you for this question as well.



来源:https://stackoverflow.com/questions/50285410/accept-application-pdf-in-ext-ajax-request

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!