I had similar issue when I was uploading a file from a Salesforce Guest Site and the below code worked for me.
LWC - HTML Code:
<label class="form-label" for="fileUpload">Please upload your invoice</label>
<lightning-input type="file" class="form-label" variant="label-hidden" accept=".png, .jpg, .jpeg, .pdf" onchange={openfileUpload}>
</lightning-input>
<p class="form-label"
style="font-size: 11px;">Note: Maximum file size: 10MB. Accepted formats: .png, .jpg, .jpeg, .pdf
</p>
<template if:true={uploadedFileInfo}>
<p class="form-label" style="color: darkblue;">{uploadedFileInfo.fileName}</p>
</template>
LWC - JS Code:
import createUploadedFile from '@salesforce/apex/YourApexClass.createUploadedFile';
@track uploadedFileInfo;
// Reading the uploaded file
openfileUpload(event) {
const uploadedFile = event.target.files[0];
let fileSize = uploadedFile.size;
let fileType = uploadedFile.type;
if(fileSize > 11004402){
alert('Please reduce the file size');
}
else{
var reader = new FileReader();
reader.onload = () => {
var base64 = reader.result.split(',')[1]; // This is file content
this.uploadedFileInfo = {
'fileName': uploadedFile.name,
'base64': base64,
'fileType' : uploadedFile.type
}
console.log(this.uploadedFileInfo)
}
reader.readAsDataURL(uploadedFile)
}
}
// Calling Apex method to create file
handleSubmit(event){
let paramsToApex = {
// Any other field values to be sent to server
parentID : 00QKN012345TCFU2A4,
fileName : (this.uploadedFileInfo != null && this.uploadedFileInfo.fileName != null) ? this.uploadedFileInfo.fileName : '#NO#FILE',
base64Data : (this.uploadedFileInfo != null && this.uploadedFileInfo.base64 != null) ? this.uploadedFileInfo.base64 : '#NO#FILE'
}
createUploadedFile({paramString : JSON.stringify(paramsToApex)}).then((result) =>{
// Handle server response
}).catch((error) =>{
// Handle any errors
});
}
Apex Code:
@AuraEnabled
public static String createUploadedFile(String paramString){
Map<String, Object> paramsMap = (Map<String, Object>)JSON.deserializeUntyped(paramString);
String parentID = (String) paramsMap.get('parentID');
String fileName = (String) paramsMap.get('fileName');
String base64Data = (String) paramsMap.get('base64Data');
if(!fileName.equalsIgnoreCase('#NO#FILE')){
createContentVersion(fileName,base64Data,parentID);
}
return 'SUCCESS';
}
@future(callout=true)
public static void createContentVersion(String title, String versionData, Id parentId) {
// If my org credentials are stored in Custom Settings. I recommend using Named Credentials instead
API_Settings__c apiCredsCustSetting = API_Settings__c.getInstance('Self_Org_API_Details');
String reasonForChange = 'New Document';
String endPointURL = apiCredsCustSetting.endpoint__c; //Ex: https://abcOrg.my.salesforce.com
endPointURL = endPointURL+'/services/data/59.0/sobjects/ContentVersion/';
String contentVersionBody = '{' +
'"Title" : "' + title + '",' +
'"VersionData" : "' + versionData + '",' +
'"ReasonForChange" : "' + reasonForChange + '",' +
'"PathOnClient" : "' + title + '"' +
'}';
HttpRequest request = new HttpRequest();
request.setEndpoint(endPointURL);
request.setMethod('POST');
request.setHeader('Content-Type', 'application/json');
request.setHeader('Authorization', 'Bearer ' + getAccessToken(apiCredsCustSetting));
request.setBody(contentVersionBody);
Http http=new Http();
HttpResponse response=http.send(request);
if (response.getStatusCode() == 201) {
Map<String,Object>jsonResponse = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
Boolean isSuccess = (Boolean) jsonResponse.get('success');
if(isSuccess == true) {
String newContentVersionId=(String) jsonResponse.get('id');
ContentDocumentLink cdl = new ContentDocumentLink();
cdl.ContentDocumentId = [SELECT ContentDocumentId FROM ContentVersion WHERE Id=: newContentVersionId LIMIT 1].ContentDocumentId;
cdl.LinkedEntityId = parentId;
cdl.ShareType = 'V';
insert cdl;
}
}
else {
System.debug('Errored response: ' +response.getBody());
}
}