我正在尝试使用Lightning输入组件将文件上传到Salesforce:
组件
<aura:component controller="FileUploadController">
<lightning:input
aura:id="fileId"
onchange="{!c.readFile}"
type="file"
name="file"
multiple="false"/>
</aura:component>
控制器
({
readFile : function(component) {
var file = component.find("fileId").get("v.files")[0];
var reader = new FileReader();
reader.onload = function(e) {
var fileContent = e.target.result;
var base64 = 'base64,';
var dataStart = fileContent.indexOf(base64) + base64.length;
fileContent = fileContent.substring(dataStart);
uploadFile(file, fileContent, component);
}
reader.readAsDataURL(file);
},
uploadFile : function(file, fileContent, component) {
var action = component.get("c.createFile");
action.setParams({
fileName: file.name,
base64Data: encodeURIComponent(fileContent)
});
$A.enqueueAction(action);
}
})
我遇到的问题是我无法从readFile()中调用uploadFile()。任何建议都很好。谢谢。
答案 0 :(得分:0)
我最终将uploadFile方法移到了一个帮助器类,并且解决了该问题:
组件
<aura:component controller="FileUploadController">
<lightning:input
aura:id="fileId"
onchange="{!c.readFile}"
type="file"
name="file"
multiple="false"/>
</aura:component>
控制器
({
readFile : function(component, event, helper) {
var file = component.find("fileId").get("v.files")[0];
var reader = new FileReader();
reader.onload = function() {
var fileContent = reader.result;
var base64 = 'base64,';
var dataStart = fileContent.indexOf(base64) + base64.length;
fileContent = fileContent.substring(dataStart);
helper.uploadFile(component, fileContent, file);
}
reader.readAsDataURL(file);
}
})
助手
({
uploadFile : function(component, fileContent, file) {
var action = component.get("c.createFile");
action.setParams({
fileName: file.name,
base64Data: encodeURIComponent(fileContent)
});
$A.enqueueAction(action);
$A.get("e.force:closeQuickAction").fire();
}
})
答案 1 :(得分:0)
为使FileReader正确读取文件内容(例如Word文档和Excel工作表),可能还必须指定ContentType: 控制器类:
public class SagarAttachFile {
public String fileName {get;set;}
public String fileValue {get;set;}
public String contentType {get;set;}
public Attachment attachment {
get {
if(attachment == null)
attachment = new Attachment();
return attachment;
}
set;
}
public SagarAttachFile()
{
fileName = '';
fileValue = '';
contentType = '';
}
public PageReference saveMethod()
{
if(attachment != null && fileName != null && fileName != ''
&& fileValue != null && fileValue != '')
{
try
{
attachment.ownerId = UserInfo.getUserId();
attachment.ParentId = '5002C000006zvjyQAA'; // Attach the uploaded file as an attachment to this Case.
attachment.Name = fileName;
fileValue = EncodingUtil.urlDecode(fileValue, 'UTF-8');
attachment.Body = EncodingUtil.base64Decode(fileValue);
attachment.ContentType = contentType;
insert attachment;
}
catch (DMLException e) {
System.debug(LoggingLevel.INFO, '#### error occurred while adding attachment to case ' + e.getMessage());
}
finally
{
attachment = new Attachment();
}
}
else
{
System.debug(LoggingLevel.INFO, '#### no attachment adding to case');
}
return null;
}
}
Visualforce页面:
<apex:page controller="SagarAttachFile">
<apex:form>
<apex:actionFunction name="saveAF" action="{!saveMethod}" reRender="attchFilePanel">
<apex:param assignTo="{!fileName}" value="" name="fileName"/>
<apex:param assignTo="{!fileValue}" value="" name="fileValue"/>
<apex:param assignTo="{!contentType}" value="" name="contentType"/>
</apex:actionFunction>
<apex:pageBlock id="pageBlock1">
<apex:outputPanel id="attchFilePanel">
<input type="file" id="file" name="attFile"/>
<apex:commandButton value="Save" onclick="javascriptFunc1(); return false;"/>
</apex:outputPanel>
</apex:pageBlock>
</apex:form>
<script>
function javascriptFunc1()
{
var fileName = null;
var file1 = document.getElementById('file');
if(file1 != null)
{
if ('files' in file1)
{
if (file1.files.length == 1)
{
alert('one file attached');
var file1Obj = file1.files[0];
if(file1Obj.name != '')
{
fileName = file1Obj.name;
}
var reader = new FileReader();
reader.onload = function() {
alert('reading is done now');
var fileContent = reader.result;
var base64 = 'base64,';
var dataStart = fileContent.indexOf(base64) + base64.length;
fileContent = fileContent.substring(dataStart);
var encodedFileContent = encodeURIComponent(fileContent);
saveAF(fileName, encodedFileContent, file1Obj.type);
}
reader.readAsDataURL(file1Obj);
}
else
{
alert('no file attached');
}
}
}
}
</script>
</apex:page>