base64存储图片/显示图片

不知道大家有没有这样一个需求:发布一篇文章,文章内容中可能涉及到图片,那么显示文章时候,如何展示文章如发布一样(包括图片),csdn 的发布文章就是一个很好的例子,虽然我不知道csdn是如何实现的,但我自己的实现方法主要有两种:

1.在富文本编辑器中上传图片,以IO流方式存储到文件服务器,上传成功后,返回图片的http地址(回显)

2.在富文本编辑器中上传图片,将图片以base64方式存储到数据表中

本文章讲的是第二种方式(base64):

demo样例(demo下载):

注:

富文本编辑器:wangEditor2

数据库:SQL Server 

开发环境:jdk1.8.0 、java语言

步骤:

1.首先,创建示例数据表如下图(demo完成后自行上传404图片):

2.制作富文本编辑器UI页面index.jsp

3.富文本编辑器处理上传js:

$(function() {
	
	
	var path = $("#path").val();
 
    var editor = new wangEditor('div1');
	
	 
	// 自定义菜单
	editor.config.menus = [ 
	    	'lineheight',
	    	'undo',
	        'bold',
	        'italic',
	        'underline',
	        'strikethrough',
	        'fontfamily',
	        'fontsize',
	        'forecolor',
	        'bgcolor',
	        'table',
	        'img'
	        
	     ];
	    
	   
	    /*
	     * 默认菜单
	     * [
        'source',
        '|',
        'bold',
        'underline',
        'italic',
        'strikethrough',
        'eraser',
        'forecolor',
        'bgcolor',
        '|',
        'quote',
        'fontfamily',
        'fontsize',
        'head',
        'unorderlist',
        'orderlist',
        'alignleft',
        'aligncenter',
        'alignright',
        '|',
        'link',
        'unlink',
        'table',
        'emotion',
        '|',
        'img',
        'video',
        'location',
        'insertcode',
        '|',
        'undo',
        'redo',
        'fullscreen'
    ];
	     * */
	    
	    
	    
	    

	    // 字体
	    editor.config.familys = [
	        '宋体','仿宋GB2312','华文仿宋', '黑体', '楷体', '微软雅黑',
	        'Arial', 'Verdana', 'Georgia'
	    ];
	    
	    // 字号
	    editor.config.fontsizes = {
	        // 格式:'value': 'title'
	        1: '10',
	        2: '10.5', 
	        3: '11', 
	        4: '11.5',
	        5: '12', 
	        6: '12.5', 
	        7: '13',
	        8: '13.5',
	        9: '14',
	        10: '14.5',
	        11: '15',
	        12: '15.5',
	        13: '16'
	    };
	    
	    
     // 上传图片
     editor.config.uploadImgUrl = path+"/upload/uploadManager.jsp?method=post";
     // 关闭粘贴内容中的样式
     //editor.customConfig.pasteFilterStyle = false
 	 // 忽略粘贴内容中的图片
 	 //editor.customConfig.pasteIgnoreImg = true
 	 // 使用 base64 保存图片
 	 //editor.customConfig.uploadImgShowBase64 = true 
 	
     // 若需传参,请在此配置参数
     editor.config.uploadParams = {
         /* token1: 'abcde',
          token2: '12345'*/
     };
     editor.config.uploadHeaders = {
         // 'Accept' : 'text/x-json'
     
     }
     // 配置统一名字,方便后台获取
     editor.config.uploadImgFileName = 'myFileName';

     // 隐藏网络图片
     editor.config.hideLinkImg = true;
     // 将图片大小限制为 3M
     //editor.customConfig.uploadImgMaxSize = 3 * 1024 * 1024; 
     
    // 自定义上传图片事件 
     editor.config.uploadImgFns.onload = function (resultText, xhr) {
         // resultText 服务器端返回的text
         // xhr 是 xmlHttpRequest 对象,IE8、9中不支持 
         var data = JSON.parse(resultText.trim());  
         //srcList.add(basePath+"/upload/uploadManager.jsp?method=get&FID="+FID); 
    	 var FIDs = data.FIDs;
         for(var i in FIDs){
        	 var fid = FIDs[i]; 
        	 var src = path+"/upload/uploadManager.jsp?method=get&FID="+fid;
        	 // 上传图片时,已经将图片的名字存在 editor.uploadImgOriginalName
             var originalName = editor.uploadImgOriginalName || '';   
             // 如果 resultText 是图片的url地址,可以这样插入图片:
             editor.command(null, 'insertHtml', '<img src="' + src + '" alt="' + originalName + '" style="max-width:100%;"/>');
             // 如果不想要 img 的 max-width 样式,也可以这样插入:
             // editor.command(null, 'InsertImage', resultText);
         } 
         
     };
     // 自定义timeout事件
     editor.config.uploadImgFns.ontimeout = function (xhr) {
         // xhr 是 xmlHttpRequest 对象,IE8、9中不支持
         alert('上传超时');
     };
     
     // 自定义error事件
     editor.config.uploadImgFns.onerror = function (xhr) {
         // xhr 是 xmlHttpRequest 对象,IE8、9中不支持
         alert('上传错误');
     };
 	

     // 插入代码时的默认语言
     // editor.config.codeDefaultLang = 'html'

     // 只粘贴纯文本
     // editor.config.pasteText = true;

     // 跨域上传
     // editor.config.uploadImgUrl = 'http://localhost:8012/upload';

     // 第三方上传
     // editor.config.customUpload = true;

     // 普通菜单配置
     // editor.config.menus = [
     //     'img',
     //     'insertcode',
     //     'eraser',
     //     'fullscreen'
     // ];
     // 只排除某几个菜单(兼容IE低版本,不支持ES5的浏览器),支持ES5的浏览器可直接用 [].map 方法
     // editor.config.menus = $.map(wangEditor.config.menus, function(item, key) {
     //     if (item === 'insertcode') {
     //         return null;
     //     }
     //     if (item === 'fullscreen') {
     //         return null;
     //     }
     //     return item;
     // });

     // onchange 事件
     editor.onchange = function () {
    	// var text = this.$txt.html().replace("a","span").replace("href","h");
    	 //this.$txt.html(text);
         console.log(this.$txt.html());
     };

     // 取消过滤js
     // editor.config.jsFilter = false;

     // 取消粘贴过来
     // editor.config.pasteFilter = false;

     // 设置 z-index
     // editor.config.zindex = 20000;

     // 语言
     // editor.config.lang = wangEditor.langs['en'];

     // 自定义菜单UI
     // editor.UI.menus.bold = {
     //     normal: '<button style="font-size:20px; margin-top:5px;">B</button>',
     //     selected: '.selected'
     // };
     // editor.UI.menus.italic = {
     //     normal: '<button style="font-size:20px; margin-top:5px;">I</button>',
     //     selected: '<button style="font-size:20px; margin-top:5px;"><i>I</i></button>'
     // };
     editor.create();
	
})

4.后台将图片保存至数据库:

package com.demo.io; 

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.jasper.tagplugins.jstl.core.Out;
import org.json.JSONObject;

import com.demo.utils.DBUtils;
import com.google.gson.Gson;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class UploadImages {

	public static void main(String[] args) {
		new Gson();
	}
	public static List<String> uploadImages(HttpServletRequest request) throws IOException {

		Connection conn = null; 
		String basePath = request.getContextPath();
		List<String> FIDs = new ArrayList<String>(); 
		BASE64Encoder encoder = new BASE64Encoder();
		/** 上传文件处理内容 **/
		DiskFileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload sfu = new ServletFileUpload(factory);
		sfu.setHeaderEncoding("UTF-8"); // 处理中文问题
		sfu.setSizeMax(10 * 1024 * 1024); // 限制文件大小
		try {
			conn = DBUtils.getConnection();
			if (conn != null) {
				StringBuffer sql = new StringBuffer("");
				List<FileItem> fileItems = sfu.parseRequest(request); // decode request
				for (FileItem fi : fileItems) {
					String FID = getUUID();
					if(!FID.equals("")) {
						String imgName = fi.getName();
						String imgByte = encoder.encode(fi.get());
						sql.append(" INSERT INTO Base64Images(FID,imageName,imageObj,IsDelete) ");
						sql.append(" VALUES ");
						sql.append(" ('"+FID+"','"+imgName+"','"+imgByte+"',0) "); 
						Statement stm = conn.createStatement();
						int i = stm.executeUpdate(sql.toString());
						stm.close();
						if(i > 0) {
							FIDs.add(FID); 
						}
					} 
				} 
			}
		} catch (Exception e) {
			e.printStackTrace(); 
		}finally {
			DBUtils.release(conn);
		}
		/**********************/
		
		return FIDs;
		
	}

	public static String getUUID() {
		String FID = "";
		Connection conn = null;
		try {
			conn = DBUtils.getConnection();
			if (conn != null) {
				String sql0 = " SELECT NEWID() AS UUID ";
				Statement stm0 = conn.createStatement();
				ResultSet rs0 = stm0.executeQuery(sql0);
				while(rs0.next()) {
					FID = rs0.getString("UUID");
				}
				rs0.close();
				stm0.close();
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			DBUtils.release(conn);
		}
		return FID;
		 
	}
	public static void outImage(String FID,HttpServletResponse response) {
		byte[] bytes = getImage(FID);
		bytes = (bytes==null)?new byte[0]:bytes; 
		response.setHeader("Pragma", "no-cache");
		response.setContentType("image/jpeg"); 
		ServletOutputStream ot = null;  
		try {
			ot = response.getOutputStream();
			ot.write(bytes); 
			ot.flush();
			ot.close();
		} catch (IOException e) { 
			e.printStackTrace();
		}  
	}
	
	public static byte[] getImage(String FID) {
		if (FID == null || FID.trim().equals("")) {
			return null;
		}
		byte[] bytes = null;
		Connection conn = null;
		BASE64Decoder decoder = new BASE64Decoder();
		try {
			conn = DBUtils.getConnection();
			if (conn != null) {
				boolean imgExist = false;
				String sql = " SELECT FID,imageObj FROM Base64Images WHERE FID = '" + FID + "' ";
				Statement stm = conn.createStatement();
				ResultSet rs = stm.executeQuery(sql);
				byte[] imgByte = null;
				while (rs.next()) { 
					imgByte = (rs.getBytes("imageObj")==null)?null:rs.getBytes("imageObj"); 
				} 
				//若根据FID在数据库找不到图片,则返回404.jpg
				if(imgByte == null) {
					String sql2 = " SELECT FID,imageObj FROM Base64Images WHERE FID = '4F40DD81-F262-4FB8-9463-7F3A29F2D8D1' ";
					Statement stm2 = conn.createStatement();
					ResultSet rs2 = stm2.executeQuery(sql2);
					while (rs2.next()) { 
						imgByte = (rs2.getBytes("imageObj")==null)?null:rs2.getBytes("imageObj"); 
					} 
					DBUtils.release(stm2, rs2);
				}
				DBUtils.release(stm, rs);
				
				if(imgByte != null) {
					imgExist = true; 
					String imgByteStr = new String(imgByte, "UTF-8");
					bytes = decoder.decodeBuffer(imgByteStr);
					for (int i = 0; i < bytes.length; i++) {
						if (bytes[i] < 0) {
							bytes[i] += 256;
						}
					}
				} 
			}
		} catch (Exception e) {
			e.printStackTrace();
			DBUtils.release(conn);
		}

		return bytes;
	}

	 
}

5.图片回显:

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用uniapp内置的base64转图片方法,具体步骤如下: 1. 在template中使用image标签,设置src属性为base64字符串。 2. 在script中使用uni.base64ToArrayBuffer方法将base64字符串转为ArrayBuffer类型。 3. 使用uni.getImageInfo方法获取图片信息,包括宽度和高度。 4. 使用uni.canvasToTempFilePath方法将ArrayBuffer类型的图片转为临时文件路径。 5. 将临时文件路径赋值给image标签的src属性,即可显示图片。 示例代码如下: <template> <view> <image :src="imgSrc"></image> </view> </template> <script> export default { data() { return { base64Str: 'base64字符串', imgSrc: '' } }, methods: { async base64ToImg() { const arrayBuffer = await uni.base64ToArrayBuffer(this.base64Str) const { width, height } = await uni.getImageInfo({ src: this.base64Str }) const tempFilePath = await uni.canvasToTempFilePath({ x: , y: , width, height, destWidth: width, destHeight: height, canvasId: 'canvas', fileType: 'jpg', quality: 1, data: arrayBuffer }) this.imgSrc = tempFilePath.tempFilePath } }, mounted() { this.base64ToImg() } } </script> ### 回答2: 在uniapp中,我们可以将一张图片编码为base64格式的字符串,然后将其在页面中进行显示。同时,我们也可以将一个base64格式的字符串转换为一张图片。 通过使用uniapp内置的Base64模块,我们可以方便地将图片数据编码为base64格式的字符串。具体的步骤如下: 1. 获取图片数据。 我们可以通过uniapp提供的API获取本地文件系统中的图片数据。例如,以下代码可以获取并读取图片: ``` uni.chooseImage({ success: function (res) { var tempFilePath = res.tempFilePaths[0]; uni.getFileSystemManager().readFile({ filePath: tempFilePath, encoding: 'base64', success: function (res) { var base64 = 'data:image/jpeg;base64,' + res.data; } }); } }); ``` 2. 将图片数据编码为base64格式的字符串。 在获取到图片数据之后,我们可以借助Base64模块将其编码为base64格式的字符串。具体的代码如下: ``` var base64 = uni.base64ToArrayBuffer(res.data); var binary = ''; var bytes = new Uint8Array(base64); var len = bytes.byteLength; for (var i = 0; i < len; i++) { binary += String.fromCharCode(bytes[i]); } var base64String = btoa(binary); ``` 3. 将base64格式的字符串转换为图片。 我们可以将一个base64格式的字符串转换为一张图片,并将其展示在页面中。具体的代码如下: ``` <img :src="base64String"/> ``` 通过以上步骤,我们可以在uniapp中实现将base64格式的图片字符串转换为图片显示到页面上的功能。同时,我们也可以将一张图片编码为base64格式的字符串并进行传输和处理。这种方法通常用于在移动端进行图片显示和上传等操作。 ### 回答3: Uniapp是一个跨平台的开发框架,它可以让开发者使用一套代码编写出同时适用于iOS、Android和H5的应用程序。在Uniapp中,我们可以通过将图片采用base64编码的方式存储在后台,然后直接将base64字符串传递到前端,最后通过js的方式将base64字符串转换为可被浏览器渲染并显示图片。 具体操作流程如下: 1. 后台将图片转换为base64编码,将其保存在数据库中或者直接传递到前端。在后台中可以使用Python等语言的base64库将图片转换为base64编码。 2. 前端接收到base64字符串后,使用以下JS代码将其转换为图片显示: ``` // 将base64字符串转换为ArrayBuffer var arr = btoa(base64String); var binary_string = window.atob(arr); var len = binary_string.length; var bytes = new Uint8Array(len); for (var i = 0; i < len; i++) { bytes[i] = binary_string.charCodeAt(i); } var blob = new Blob([bytes.buffer], { type: "image/png" }); // 在html中添加img标签并显示图片 var objUrl = URL.createObjectURL(blob); var img = document.createElement("img"); img.src = objUrl; // 将img标签添加到需要显示的dom节点中 ``` 以上代码将base64字符串转换为ArrayBuffer、Blob和ObjectURL等格式,并最终显示在浏览器中。 需要注意一点的是,在使用base64编码的图片时,会占用更多的内存,因此在使用时应注意优化图片尺寸和压缩比例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值