salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件

在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取。salesforce 零基础学习(二十四)解析csv格式内容中有类似的使用此标签进行解析附件内容,后台只要声明String类型变量用来存储附件名称,Blob类型变量用来存储附件的内容即可。

但是当我们的项目整体使用第三方的前端框架,例如VUE或者angular等前端框架时,有时使用apex:inputFile反而不是很方便,需要用到html的原生的附件上传的标签<input type="file"/>实现附件的上传。下面的demo用来实现使用 remote action方式实现Attachment的添加操作。

本篇主要通过 JavaScript中的FileReader对象,将文件进行base64编码,然后后台进行base64解码来实现Blob对象传递到后台。

一.AddAttachmentByInputFileController: 后台RemoteAction用来实现附件上传,构造函数中hardcode搜索出一个指定的Account

 1 public with sharing class AddAttachmentByInputFileController {
 2     public String accountId{ get; set; }
 3     public AddAttachmentByInputFileController() {
 4         Account testAccount = [SELECT Id
 5                                 FROM Account
 6                                 WHERE Name = ‘york zhang‘];
 7         accountId = testAccount.Id;
 8     }
 9     @RemoteAction
10     public static String testAddAttachment(String attachmentName,String attachmentBody,String parentId) {
11         String operateResult;
12         Attachment tmpAttachment = new Attachment();
13         tmpAttachment.Name = attachmentName;
14         tmpAttachment.Body = EncodingUtil.base64Decode(attachmentBody);
15         tmpAttachment.ParentId = parentId;
16         try {
17             insert tmpAttachment;
18             operateResult = ‘Successfully‘;
19         } catch (Exception e){
20             operateResult = ‘Failed‘;
21         }
22         return operateResult;
23     }
24 }

二.AddAttachmentByInputFile:  VF页面实现上传附件,解析以及调用后台保存到指定Account上。其中要注意的是Base64编码以后,对文件大小有限制,使用input type file最大上传大小为4.3M。javascript中使用FileReader对数据进行二进制处理。

 1 <apex:page controller="AddAttachmentByInputFileController">
 2     <script type="text/javascript">
 3         function saveAttachment() {
 4
 5             var maxFileSize = 4350000;      //Base64 编码以后最大的文件字节数
 6             var attachmentBody;                //附件内容
 7             var attachmentName;                //附件名称
 8             var fileSize;                     //附件大小
 9
10             var testFiles = document.getElementById(‘testAttachment‘).files;
11             var testFile = testFiles[0];
12
13             if(testFile != undefined) {
14                 if(testFile.size <= maxFileSize) {
15                     attachmentName = testFile.name;
16                     var fileReader = new FileReader();
17                     fileReader.onloadend = function(e) {
18                     attachmentBody = window.btoa(this.result);  //Base 64 encode the file
19                     fileSize = attachment.length;
20
21                     Visualforce.remoting.Manager.invokeAction(
22                       ‘{!$RemoteAction.AddAttachmentByInputFileController.testAddAttachment}‘,
23                       attachmentName,
24                       attachmentBody,
25                       ‘{!accountId}‘,
26                       function(result,event) {
27                         alert(result);
28                       });
29
30                     }
31                     fileReader.onerror = function(e) {
32                       alert("上传失败,请重新尝试");
33                     }
34                     fileReader.onabort = function(e) {
35                       alert("上传失败,请重新尝试");
36                     }
37
38                     fileReader.readAsBinaryString(testFile);
39
40                 } else {
41                     alert("Base64 编码最大允许4.3M文件");
42
43                 }
44             } else {
45                 alert("请先选择一个附件上传。");
46
47             }
48         }
49     </script>
50     <input type="file" id="testAttachment" value="" filename="testAttachment"/>
51     <br/>
52     <input type="Button" value="Attach" onclick="saveAttachment()"/>
53 </apex:page>

结果展示:

1.上传一个文件,点击Attach按钮,提示上传成功。

2.找到对应的Account,附件已经成功绑定上传。

总结:此篇主要描述使用 input type=file时,salesforce针对上传附件的处理。篇中还有好多的地方可以优化,比如 javascript remoting也有最大的传输限制,String字符串也有最长的限制, FileReader不是所有的浏览器都兼容。这些细节处理感兴趣的可以自己优化一下。

原文地址:https://www.cnblogs.com/zero-zyq/p/9651438.html

时间: 2024-10-08 09:48:02

salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件的相关文章

salesforce 零基础学习(十九)Permission sets 讲解及设置

Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Profile但是对于某个表,某个字段,或者某个Apex类等却可以有不同访问权限,这个时候就要用到Permission sets.  Permission sets 配置 1.点击setup->Administer->Manage Users->Permission Sets进入Permissio

salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随便的取一个审批人了,有以下方式针对不同的场景可以获取到当前记录的最终审批人以及审批意见. 邮件内容使用以下几种方式实现: 1.代码里面实现邮件发送 2.email template(text/html/custom) 3.visualforce emailTemplate 对发送邮件方式不清楚的,可

salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-from.html 群里面有个小伙伴问了一个关于两个有Dependence关系的Picklist字段如何在Apex中通过control字段的值获取到Dependence字段的值,针对Salesforce配置来说,我们很好配置出两个Dependence字段的关系,通过点击设置一下include关系即可.如

salesforce 零基础学习(五十二)Trigger使用篇(二)

第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. 十七篇链接:salesforce 零基础学习(十七)Trigger用法 有的时候对于sObject的trigger处理复杂的情况下,比如一个sObject的before update要实现功能1,2.....n功能情况下,Handler中需要在before update写实现功能1--n的代码.然而

salesforce零基础学习(八十四)配置篇: 自定义你的home page layout

当我们进入salesforce系统或者切换app后,默认第一个看到的就是home页面.home页面简单的来说可以包括左侧(narrow component)和右侧(wide component)两部分. 左侧包含Recent View,Custom Link,Create New等快捷入口等组件,右侧包括tasks,item to approval,calendar,dashboard snapshot等等. 有时,不同简档的用户需要看到不同的Home页面中的组件或者显示不同的custom li

salesforce 零基础学习(四十四)实现checkbox列表简单过滤功能

现在做的项目代码是原来其他公司做的,要在原来基础上业务进行适当调整加上一些CR,其中有一个需要调整的需求如下: 原来使用apex:selectCheckboxes封装了一个checkbox列表,因为数据太多导致显示起来比较丑,用户希望改进一下UI. apex:selectCheckboxes作用原理为解析成html以后变成table标签, 大概层级结构可以分成<table><tbody><tr><td><input type="checkbo

salesforce 零基础学习(五十三)多个文件生成一个zip文件(使用git上封装的代码)

此篇参考git代码:https://github.com/pdalcol/Zippex 学习salesforce可以访问一个朋友的网站:https://www.xgeek.net 首先感谢git上提供代码的大神,学到了新的知识.salesforce不像java提供生成Zip文件的类库,通过git上copy的代码可以实现此功能,具体的使用方法以及API可以查看上方git链接. 概述:实例模拟三个上传组件,加上一个下载Zip包按钮,本地选择需要上传的文件,点击按钮后便会下载成一个压缩文件,压缩文件中

salesforce 零基础学习(三十八) soql函数以及常量

在salesforce中,我们做SOQL查询时,往往需要用到计算式,比如求和,求平均值,或者过滤数据时,往往需要通过时间日期过滤,SOQL已经封装了很多的函数,可以更加方便我们的sql查询而不需要自己另外设计. 一. 聚合函数 常用的聚合函数有如下几种: AVG():求平均值 COUNT():求记录个数 COUNT_DISTINCT():求不重复记录个数 MIN():求记录中最小值 MAX():求记录中的最大值 SUM():求和 这些聚合函数通常和group by fieldName 一起用,达

salesforce零基础学习(七十八)线性表链形结构简单实现

前两篇内容为栈和队列的顺序结构的实现,栈和队列都是特殊的线性表,线性表除了有顺序结构以外,还有线性结构. 一.线性表的链形结构--链表 使用顺序存储结构好处为实现方式使用数组方式,顺序是固定的.所以查询某个位置的元素特别容易,时间复杂度为O(1),但是当增加或者删除时,会需要将操作元素后面的元素整体向左或者向右平移.时间复杂度为O(n).所以当线性表查询操作多于增删操作,优先使用顺序存储结构的线性表:当线性表增删操作多于查询操作,则优先使用链式存储结构的线性表. 线性表的链式存储结构的特点是用一