Salesforce图片上传

Salesforce图片上传的方式可通过自带组件apex:inputFile及html标签input type="file"实现。

1、效果

2、apex:inputFile实现

采用标准组件inputFile并将值赋给页面变量(view state)Picture

<apex:pageBlockSection columns="1">
	<apex:inputFile value="{!Picture}" accept="image/*" />
</apex:pageBlockSection>
<apex:pageBlockButtons>
	<apex:commandButton value="Save" action="{!save}" />
</apex:pageBlockButtons>
public with sharing class Test_HpcUploadImg {
public blob Picture { get; set; }

public PageReference save() {
	ErrorMessage = ‘‘;
	try {
		if (picture != null) {
			String url = CN_SPR_UploadAzureHelper.UploadToAzure(picture,‘.jpg‘,‘application/octet-stream‘);
			ErrorMessage=url;

注意:

此种方式图片大小限制为170KB,超过则提示“Maximum view state size limit (170KB) exceeded. Actual view state size for this page was 293.157KB”

3、input type="file"实现

<div class="slds-col slds-size_1-of-1 slds-p-horizontal_medium">
    <img id="imgPreview_csp" style="width:180px;height:180px;" src="{!URLFOR($Resource.India_Content, ‘img/sample_picture.png‘)}" />
</div>
<div class="slds-col slds-size_1-of-1 slds-p-horizontal_medium" style="margin-top:5px;">
    <input type="file" id="fileImg_csp" value="" filename="fileImg_csp" style="display:none;" accept=".jpg,.jpeg,.png" />
    <button class="slds-button slds-button_neutral" id="btnSelecttPic" style="display:none;">Select a Picture</button>
    <input type="Button" value="Upload" id="btnSave_csp" class="slds-button slds-button_brand" style="display:none;" />
</div>
//选择图片,马上预览
function changeImg(obj) {
    var file = obj.files[0];
    var reader = new FileReader();

    //读取文件过程方法
    reader.onloadstart = function (e) { //开始读取
    }
    reader.onprogress = function (e) { //正在读取中
    }
    reader.onabort = function (e) { //中断读取
    }
    reader.onerror = function (e) { //读取异常
    }
    reader.onload = function (e) { //成功读取
        var files = document.getElementById(‘fileImg_csp‘).files;
        var fileName = files[0].name;
        //判断文件后缀
        if (!(/\.jpg$/.test(fileName) || /\.jpeg$/.test(fileName) || /\.png$/.test(fileName))) {
            Messages.add(Messages.Type.error, "JPG,PNG images only supported");
            return;
        }
        var img = document.getElementById("imgPreview_csp");
        img.src = e.target.result;
        //或者 img.src = this.result;  //e.target == this
    }

    reader.readAsDataURL(file);//必须要加
}

//上传
function saveImg() {
    Messages.clear();

    var maxFileSize = 1572864;      //1.5M=1.5*1024*1024
    var attachmentBody;                //附件内容
    var attachmentName;                //附件名称
    var fileSize;                     //附件大小

    var Files = document.getElementById(‘fileImg_csp‘).files;
    var File = Files[0];

    if (File != undefined) {
        if (File.size <= maxFileSize) {
            attachmentName = File.name;
            //判断文件后缀
            if (!(/\.jpg$/.test(attachmentName) || /\.jpeg$/.test(attachmentName) || /\.png$/.test(attachmentName))) {
                Messages.add(Messages.Type.error, "JPG,PNG images only supported");
                return;
            }
            // debugger;
            var fileReader = new FileReader();
            fileReader.readAsBinaryString(File);
            fileReader.onloadend = function (e) {
                Spinner.show();
                //原始对象
                // attachmentBody = this.result;
                //Base64(btoa用于将对象创建为base-64 编码的字符串)
                attachmentBody = window.btoa(this.result);
                //Base64编码转换为Blob
                // attachmentBody=getBlob(window.btoa(this.result));

                Visualforce.remoting.Manager.invokeAction(
                    ‘{!$RemoteAction.IN_ChillerStandardPicture_Controller.UploadPicture}‘,
                    attachmentName,
                    attachmentBody,
                    getQueryParams(),
                    function (result, event) {
                        Spinner.hide();
                        console.log(result);
                        // alert(‘Upload Successfully‘);
                        Messages.add(Messages.Type.info, "Upload Successfully");
                    });

            }
            fileReader.onerror = function (e) {
                // alert("Upload failed");
                Messages.add(Messages.Type.error, "Upload failed");
            }
            fileReader.onabort = function (e) {
                // alert("Upload failed");
                Messages.add(Messages.Type.error, "Upload failed");
            }
            fileReader.onload = function (e) {

            }
        } else {
            // alert("Maximum upload of 1.5M files is allowed");
            Messages.add(Messages.Type.error, "Maximum upload of 1.5M files is allowed");
        }
    } else {
        // alert("Please select a file first");
        Messages.add(Messages.Type.error, "Please select a file first");
    }
}
//上传图片
@RemoteAction
public static String UploadPicture(String attachmentName,String attachmentBody,String queryParam) {
    try {
        //反序列化
        IN_AvailablilityAbi_Controller.QueryRequestParam req = (IN_AvailablilityAbi_Controller.QueryRequestParam)JSON.deserialize(queryParam, IN_AvailablilityAbi_Controller.QueryRequestParam.class);

        //上传图片到Azure
        // Blob blobFile= Blob.valueOf(attachmentBody);//将Base64编码的字符串转换为Blob【此处有问题】
        Blob blobFile = EncodingUtil.base64Decode(attachmentBody);//将Base64编码的字符串转换为Blob
        string fileSuffix= attachmentName.substring(attachmentName.indexOf(‘.‘));//后缀
        String url = CN_SPR_UploadAzureHelper.UploadToAzure(blobFile,fileSuffix,‘application/octet-stream‘);

注意:

此种方式测试了1.7M的图片可正常上传,5M则提示超出了大小限制(具体限制大小需再做测试)

4、建议

建议采用input type="file"实现的方式,且将图片以Base64传输到后端再进行流的转换。如果在前端进行Blob的转换需要考虑后端接收流的方式。

JS将Base64编码转换为Blob的实现如下:

//Base64编码转换为Blob
function getBlob(text) {
 var buffer = new Uint8Array(text.length);
 var pecent = 0, loop = null;
 for (var i = 0; i < text.length; i++) {
     buffer[i] = text.charCodeAt(i);
 }
 var format = ‘image/jpeg‘;

 try {
     return new Blob([buffer], { type: format });
 } catch (e) {
     var bb = new (window.BlobBuilder || window.WebKitBlobBuilder || window.MSBlobBuilder);
     buffer.forEach(function (buf) {
         bb.append(buf);
     });
     return bb.getBlob(format);
 }
}

原文地址:https://www.cnblogs.com/hepc/p/10891711.html

时间: 2024-08-30 17:47:57

Salesforce图片上传的相关文章

jq upload图片上传代码

/* * 图片上传 * */ function postImgData() { $("#addFileInfo input[name='file']").change(function () { console.log($(this).val()) if (!$(this).val()) { return } var fileTyle = $(this).val().split("."); console.log(fileTyle); if (fileTyle[1]

[项目构建 五]babasport ajax图片上传及FastDFS入门案例.

今天来开始写图片上传的功能, 现在的图片上传都讲求 上传完成后立刻回显且页面不刷新, 这里到底是怎么做的呢? 当然是借助于ajax了, 但是ajax又不能提交表单, 这里我们还要借助一个插件: jquery.form.js剩下的一个是FastDFS, 那么什么是FastDFS呢? FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server).存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文

ckeditor4.5.1配置图片上传的方法

本篇博文主要面向初学者,一步一步地实现ckeditor的图片上传,欢迎各位大神指正. ckeditor的图片上传默认是关闭的,网上也有很多相关的教程,可是不是讲的不完整,就是版本太旧已经不适用.我写这篇博文主要面向初学者,有错误的地方欢迎指正. 截止本文撰写,ckeditor最新版本是4.5.1,我下载的版本是4.5.1standard,如果本文的方法不管用,请下载同一版本尝试. 1.开启图片上传界面 文件地址:ckeditor/plugins/image/dialogs/image.js 搜索

数往知来 JQuery 图片上传_水印 &lt;二十二&gt;

一.图片上传  :enctype='multipart/form-date 首先在进行文件上传时,添加form表单中的enctype属性指定enctype='multipart/form-date', 文件数据发送给服务端,并不是把文件路径发送给服务端了,它会随机生成一个分割字符串, 把每一个表单元素分割开 <form method='post' action='' enctype='multipart/form-date'> //这里的enctype是提交请求报文的报文体的一种编码格式, 默

微信端调取相册和摄像头,实现图片上传,并上传到本地服务器

在微信公众号网页开发时,遇到了图片上传的问题,查看了微信的开发者文档,里面的资料比较全.接着我们看一下整个的流程 1.config权限配置 $.ajax({ url:'wx_getConfig', type:'get', dataType:'json', async:false, success:function(data){ var appId = data[0].appId; var timestamp = data[0].timestamp; var nonceStr = data[0].

java图片上传(mvc)

最近有开始学起了java,好久没写文章了,好久没来博客园了.最近看了看博客园上次写的图片上传有很多人看,今天在一些篇关于java图片上传的.后台接收用的是mvc.不墨迹了,直接上图. 先看目录结构.idea开发. 一.图片上传还是使用的这款jq插件.前端部署这款插件,不用说了吧.效果图       二.前台代码只需要盖一个位置.因为是比较好用的插件.插件样式自行修改. 三.后台代码. 后面看不见的. 这个图片上传主要是自己写了几个函数.让图片储存更加方便.分成了年月日储存.但是后期遍历比较困难,

.net core CKEditor 图片上传

最近在玩 asp.net core,不想用UEditor,想使用CKEditor.故需要图片上传功能. 废话不多说,先上效果图: CKEditor 前端代码: <text id="content" name="content"></text> <script> CKEDITOR.replace('content'); </script> CKeditor config.js 配置代码:需要配置图片上传路径 CKEDIT

微信JS-SDK接口 + FLASK实现图片上传

最近在做一个项目从全球各地采集图片,考虑采用微信JS-SDK来简化开发.图片会首先上传到微信的服务器,返回一个id,然后根据这个id去微信服务器获取图片.微信提供可选择的压缩图片功能.图片首先上传到微信的服务器,可以保障较好的上传稳定性. 详细内容请参考微信的官方文档:微信JS-SDK说明文档 运行页面如下 HTML 在微信demo的基础上修改,见微信JS-SDK DEMO页面 增加图片的多次选择,多次上传,删除等功能 uploadImage.html <!DOCTYPE html> <

CKEditor图片上传实现详细步骤(使用Struts 2)

本人使用的CKEditor版本是3.6.3.CKEditor配置和部署我就不多说. CKEditor的编辑器工具栏中有一项"图片域",该工具可以贴上图片地址来在文本编辑器中加入图片,但是没有图片上传. "预览"中有一大堆鸟语,看得很不爽.可以打开ckeditor/plugins/image/dialogs/image.js文件,搜索"b.config.image_previewText"就能找到这段鸟语了,(b.config.image_prev