FlexCell图片显示问题

摘要:
2) 由于图像的转换字符串无法保存在数据库字段中,因此在上载附件时,请保存图像本身和base64编码的转换字符串的txt文件;3) 显示时,读取txt中的字符串拼接xml文件。

1、  在FlexCell设计器中,添加图片,导出xml 可以看到 

图片不大于20k显示:(20KB为不准确的数字)

 FlexCell图片显示问题第1张

  图1

图片大于20k显示:(20KB为不准确的数字)

FlexCell图片显示问题第2张

图2

图片转换为一串字符串,是Base64编码格式的

2、  所以flexcell图片显示问题思路是:

1)上传图片同时,转换为以base64编码格式的字符串;

显示时,按1、中的规则拼接xml文件。

2)由于图片转换后的字符串无法存到数据库字段里(varchar类型最大是8000,转换后的字符串长度可能大于8000,所以不可以;text、nclob等测试),所以上传附件时,保存图片本身外,还要保存一个base64编码转换后的字符串的txt文件;

3)显示时,读取txt内的字符串拼接xml文件。

3、  现在解决“图1”的情况(图2待解决),即图片大小不大于20KB。

1)  在xt_user表添加base64photo(varchar)字段,用来保存txt文件名

2)  在用户新增、编辑界面保存事件添加

//服务器保存文件夹
string strSaveDir = Server.MapPath("~" + ConfigurationSettings.AppSettings["upRootPathUser"]);
//上传图片文件名
        string filenames = DateTime.Now.ToString("yyyyMMddhhmmss") + photo.FileName;
//base64转码后txt文件名
        string base64filenames = DateTime.Now.ToString("yyyyMMddhhmmss")+(new Random(999)).ToString() + ".txt";
//判断是否上传图片
        if (photo.HasFile)
        {
            //保存图片到服务器
            photo.SaveAs(strSaveDir + filenames);           
            //Stream ImageInputStream = photo.PostedFile.InputStream;
            //string ss = ImgToBase64String(ImageInputStream);
            //判断上传图片大小
            if (photo.FileBytes.Length <= 20000)
            {
                //调用转码以及生成txt文件方法
                ImageToBase64Helper base64helper = new ImageToBase64Helper();
                base64helper.FileCreateWriteTxt(strSaveDir + base64filenames, base64helper.ImgToBase64String(photo.PostedFile.InputStream));
                //给相应字段赋值
                yhgl.Base64Photo = base64filenames;
                yhgl.Photo = filenames;
            }
            else 
            {
                Response.Write("<script>alert('电子签名图片大小不大于20KB!');</script>");
                return;
            }
        }

3)  新建图片转换base64编码类

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Drawing;
using System.IO;

/// <summary>
///ImageToBase64Helper 的摘要说明
/// </summary>
public class ImageToBase64Helper
{
    public ImageToBase64Helper()
    {
        //
        //TODO: 在此处添加构造函数逻辑
        //
    }

    
    /// <summary>
    ///   把图片文件转换为Base64编码值
    /// </summary>
    /// <param name="Imagefilename">Imagefilename客户端全路径例子:photo.PostedFile.Filename的值(这个例子里的值,需要设置浏览器启用“将文件上载到服务器并包含本地路径”)</param>
    /// <returns>Base64编码值</returns>
    public string ImgToBase64String(string Imagefilename)
    {
        try
        {
            Bitmap bmp = new Bitmap(Imagefilename);
            MemoryStream ms = new MemoryStream();
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] arr = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(arr, 0, (int)ms.Length);
            ms.Close();
            String strbaser64 = Convert.ToBase64String(arr);
            return strbaser64;
        }
        catch (Exception ex)
        {
            return "";
        }
    }

    
    /// <summary>
    /// 把图片文件转换为Base64编码值
    /// </summary>
    /// <param name="ImageInputStream">ImageInputStream控件photo.PostedFile.InputStream;</param>
    /// <returns>Base64编码值</returns>
    public string ImgToBase64String(Stream ImageInputStream)
    {
        try
        {
            Bitmap bmp = new Bitmap(ImageInputStream);
            MemoryStream ms = new MemoryStream();
            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            byte[] arr = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(arr, 0, (int)ms.Length);
            ms.Close();
            String strbaser64 = Convert.ToBase64String(arr);
            return strbaser64;
        }
        catch (Exception)
        {
            return "";
        }
    }
    /// <summary>
    /// 创建文件,写入内容
    /// </summary>
    /// <param name="filepath"> 创建文件,文件全路径</param>
    /// <param name="txtContent">写入的内容</param>
    public void FileCreateWriteTxt(string filepath, string txtContent)
    {
        //string strSaveDir = Server.MapPath("~" + ConfigurationSettings.AppSettings["upRootPathUser"]);
        //string filename = DateTime.Now.ToString("yyyyMMddhhmmss") + ".txt";

        using (FileStream fs = new FileStream(filepath, FileMode.Create))
        {
            StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.GetEncoding("GB2312"));
            //开始写入
            sw.Write(txtContent);
            //清空缓冲区
            sw.Flush();
            //关闭流
            sw.Close();
            fs.Close();
        }
    }
    /// <summary>
    /// 读取指定文件的内容
    /// </summary>
    /// <param name="filepath">文件全路径</param>
    /// <returns>文件内容</returns>
    public string FileReadTxt(string filepath)
    {
        //string strSaveDir = Server.MapPath("~" + ConfigurationSettings.AppSettings["upRootPathUser"]);

        using (StreamReader objReader = new StreamReader(filepath))
        {
            string sLine = "";
            sLine = objReader.ReadToEnd();
            objReader.Close();
            return sLine;
        }
    }
}

4)  在显示页拼接xml文件格式如图1

/// <summary>
    /// 初始化数据
    /// </summary>
    protected void initData()
    {
        string file_name = Server.MapPath("../Excel/" + "TPCS.xml");
        XmlDocument xml = new XmlDocument();
        xml.Load(file_name);
        if (xml != null)
            hidXML.Value = xml.OuterXml;
        string strXml = "";
        string strImageXml = "<Images>";


        string strSaveDir = Server.MapPath("~" + ConfigurationSettings.AppSettings["upRootPathUser"]);
        string strsql = " select top 1 base64photo from xt_user where id=1 ";
        DataRow dr = general.SelectQuery(strsql);
 //给定单元格添加上图片Image1要与image定义的Key一致
        strXml += "<Cell Row='1' Col='1' HasImage='True'>Image1</Cell>";
        //拼接图片组,关联Key与图片编码文件内容,通过FileReadTxt获取图片编码
        strImageXml += "<Image Key='Image1'>" + base64helper.FileReadTxt(strSaveDir + dr["base64photo"].ToString()) + "</Image></Images>";

        hidXML.Value = hidXML.Value.Replace("</Cells>", strXml.Replace("&nbsp;", "") + "</Cells>");
        hidXML.Value = hidXML.Value.Replace("</Cells>", "</Cells>" + strImageXml.Replace("&nbsp;", ""));
        string strScript = "<script language=" + "'vbscript'" + ">LoadXml()</script>";
        Page.ClientScript.RegisterStartupScript(GetType(), "", strScript);
}

待解决问题

1)  图片大小大于20KB的处理(不清楚FlexCell怎么截断base64编码串分成几段Part)。

2)  图片转换Base64编码显示,用在html中时有的浏览器不支持,FlexCell是否也存在类似情况不知道。

免责声明:文章转载自《FlexCell图片显示问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Pandas学习(4、数据载入、存储及文件格式ppt 图的基本算法 Bfs下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

5-URL.createObjectURL()的使用方法

官方说明问文档 URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。 URL.createObjectURL(blob)和FileReader.rea...

Base64工具类:将前端vue与后台SpringBoot传输的参数进行加密和解密

一、前端加密 1.引入base64依赖: cnpm install --save js-base64 2.使用base4对参数进行加密: let Base64 = require('js-base64').Base64 //加密方法 let password =Base64.encode(password);//解密方法 //let password =...

【转】二维码生成原理

原文链接:QR码生成原理-QR Code(ISO 18004)编码方式 一、什么是QR码 QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。QR码的样子其实在很多场合已经能够被看到了,我这还是贴个图展示一下: 这个图如果被正确解码,应该看到我的名字和邮箱。 二、QR码的特点 说到QR码的特点: 一是高速读取...

ffmpeg转码时对编码率和固定码率的处理

http://www.rosoo.net/a/201107/14663.html 一般fps在代码里这样表示 Fps = den/num 如果den = 15,num=1,则fps = 15。 如果帧率固定,pts*fps 就表示当前是第几帧。 当输入视频流的帧率不固定,如rmvb ,而输出视频流的帧率固定,ffmpeg作如下处理(参考ffmpeg代码版本...

001python基础

1、Python源码的头文件中要声明编码方式 例如:按照UTF-8编码读取源代码 #coding=utf-8#coding:utf-8#-*- coding:utf-8 -*- 2、命令行与python交互模式 2.1 在windows开始菜单选择“命令提示符”,就进入到命令行模式2.2 在命令行模式下敲命令python,然后就进入到python交互模式2...

转义、编码和加密

转义、编码和加密是开发中很常见也很基础的概念。对于初学开发的开发者,可能有时会无法准确的区分着几个词。我们将通过这篇文章来了解一下“转义、编码和加密”这几个词的关联和区别。 转义 第一种转义场景 绝大多数的开发者都曾经在自己学习第一个编程语言时,就遇到了这个概念。以经典的C语言中字符串中的字符转义为例。 如果在一个字符串中存在一个",那么就需要在"前添加才...