3

I need to input a CSV file using <input type='file'> from an Lightning Component and pass it to an Apex Controller for further processing.

Component

<input type="file"  aura:id="file-upload-input" id="file-upload" class="slds-file-selector__input slds-assistive-text" onchange="{!c.fileSelected}"/>

JS Controller

fileSelected : function(component, event, helper) {
    var fileInput = component.find("file-upload-input").getElement();
    var file = fileInput.files[0];
    console.log('file'+file);
    var action = component.get("c.passFile");
    action.setParams({ file : file } );

    action.setCallback(this, function(actionResult) {
        console.log((actionResult.getReturnValue()));
        // component.set("v.emailStr", actionResult.getReturnValue());     
    });
    $A.enqueueAction(action);
}

Apex Controller

@AuraEnabled
public static void passFile(Blob file)
{
    System.debug('Inside Apex');
    System.debug('file'+file);
}

This gives an Salesforce Internal Error

7

You can't pass a Blob type to an apex controller method. You'll have to encode the file in your Javascript method, then decode it in your apex controller like this:

Lightning controller

var reader = new FileReader();
var self = this;
reader.onload = function () {
     action.setParams({ file : encodeURIComponent(reader.result) } );
     action.setCallback(self, function(actionResult) {
         console.log((actionResult.getReturnValue()));
         // component.set("v.emailStr", actionResult.getReturnValue());     
     });
     $A.enqueueAction(action);
};
reader.readAsDataURL(file);

Apex controller

String myFile = EncodingUtil.urlDecode(file, 'UTF-8');
  • Why the delete? – Adrian Larson Jun 26 '17 at 11:47
  • @AdrianLarson Because I was missing a part :) – Martin Lezer Jun 26 '17 at 12:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.