Я пытаюсь создать компонент Lightning, который использует кнопку для вызова API. Ответ находится в форме Content Disposition, которая возвращает файл Excel. Я хотел бы иметь возможность автоматически загружать файл Excel на локальный компьютер пользователя, когда пользователь нажимает кнопку.

Не знаете, как обрабатывать ответ Http для передачи компоненту Lightning для инициации загрузки. Любая помощь приветствуется.

Компонент молнии

<aura:attribute name="recordId" type="String"/>
<aura:attribute name="workbookOption" type="String"/>
<aura:attribute name="downloadLink" type="String"/>

<lightning:card title="Workbook Download">    
        <p class="slds-p-horizontal_large">
            <lightning:select name="selectItem" label="Select a Template" value="{!v.workbookOption}">
                <option value="">None</option>
                <option value="Option1">Agency Screening Workbook</option>
                <option value="Option2">Fannie Mae</option>

            </lightning:select>
            <lightning:button variant="brand" label="Create" onclick="{!c.callOutCtrl}" />

        </p>      
</lightning:card>

Контроллер Javascript

    ({
    callOutCtrl : function(component, event, helper) {
        var action = component.get("c.getFile");
        action.setParams({
                strOppId : component.get("v.recordId"),
                workbookOption : component.get("v.workbookOption")
        });
        action.setCallback(this, function(response){
            //Need to get returned Excel file from the Controller after making API call
        });

        $A.enqueueAction(action);
    }
})

Контроллер Apex

public class ExcelHandler {  

    @AuraEnabled
    public static void getFile(String strOppId, String workbookOption) {

        HttpRequest request = new HttpRequest();
        //Make API call

        //Found this online (https://developer.salesforce.com/forums#!/feedtype=SINGLE_QUESTION_SEARCH_RESULT&id=906F0000000AY1qIAG)
        String base64value = EncodingUtil.base64Encode(response.getBodyasBlob());

        //Need to download Excel file on the Lightning Component
    }
}
2
Dhanik Lal Sahni 7 Окт 2019 в 16:36

1 ответ

Лучший ответ

Вы можете использовать URI данных для загрузки файла:

action.setCallback(this, response => {
  let a = document.createElement('a');
  a.href = 'data:application/vnd.ms-excel;base64,'+response.getReturnValue();
  a.download = 'filename.xls';
  a.click();
});

Обратите внимание, что вашу функцию необходимо изменить, чтобы она возвращала строку:

@AuraEnabled
public static String getFile(String strOppId, String workbookOption) {
    // ...
    return EncodingUtil.base64Encode(res.getBodyAsBlob());
}
4
sfdcfox 7 Окт 2019 в 21:51
Спасибо, я получаю следующую ошибку для инструкции return: «Метод не существует или неверная подпись: void base64Encode(String) из типа System.EncodingUtil»
 – 
Al K
7 Окт 2019 в 18:29
Да, это должен был быть getBodyAsBlob(). Я обновил этот ответ, чтобы отразить это.
 – 
sfdcfox
7 Окт 2019 в 18:52
Еще раз спасибо. Я внес изменения, и при попытке выполнить вызов API он возвращает ошибку в компоненте Lightning: «Неперехваченная ошибка в $A.getCallback() [a.getReturnValue не является функцией] Ошибка обратного вызова: apex://WorkbookHandler/ACTION $getFile кажется связанным со строкой a.download = filename.xlsx. Я попытался изменить расширение файла на другие связанные форматы Excel, но безуспешно. Благодарим вас за помощь в этом.
 – 
Al K
7 Окт 2019 в 19:22
Нет, извините, это была очередная опечатка с моей стороны. Это (надеюсь) окончательное редактирование должно решить проблему.
 – 
sfdcfox
7 Окт 2019 в 21:52
Хорошо, кажется, что это работает, но с помощью Google Chrome я не могу загрузить файл. Загрузка завершается с ошибкой сети на панели загрузки. Сетевой канал Chrome не показывает, что что-либо было возвращено. Если я использую Execute Anonymous, он показывает успешный вызов API, возвращающий Blob. Кажется, это последний шаг в попытке заставить это работать, но я не могу понять это. Спасибо
 – 
Al K
7 Окт 2019 в 22:59