1、先在我们的项目里加几个工具类,代码如下

AbstractUploadAction (名字可以自取,这个不影响)


import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.tomcat.util.http.fileupload.IOUtils;
public abstract class AbstractUploadAction {public void get(HttpServletRequest request, HttpServletResponse response, String storeDir) {String requestPath = "get";String requestURI = request.getRequestURI();String path = requestURI.substring(requestURI.indexOf(requestPath) + 3);String separator = File.separator;String lcPath = "";File directory = new File(storeDir);String tempPath = directory.getAbsolutePath() + path.replace("/", separator);File downloadFile = new File(tempPath);if (downloadFile.exists()) {lcPath = directory.getAbsolutePath() + path.replace("/", separator);}try {InputStream input = new FileInputStream(lcPath);OutputStream output = response.getOutputStream();IOUtils.copy(input, output);input.close();output.close();} catch (Exception var14) {}}}

UploadFileAction 这里有一个@Value("${store.dir}") private String storeDir; 这是在yml里面的定义的,这里就是把文件放在我的D盘下的ms_file文件夹下面

import java.io.IOException;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/res/file")
public class UploadFileAction extends AbstractUploadAction{@Value("${store.dir}")private String storeDir;//这个是在yml里面定义的/*** * @param folder 文件文件夹。即分类文件夹。如imgType1,imgType2。通过url的upload/后面的值来取值。也可换为其他取值方式。* @param request* @return* @throws IOException*/@RequestMapping(value = {"upload/{folder}"},method = {RequestMethod.POST, RequestMethod.GET})@ResponseBodypublic Object upload(@PathVariable("folder") String folder, HttpServletRequest request) throws IOException {UploadFileUtil uploadFileUtil = new UploadFileUtil();return uploadFileUtil.upload(storeDir, folder, request);}@RequestMapping("/get/**")public void download(HttpServletRequest request, HttpServletResponse response) {this.get(request, response, this.storeDir);} }

UploadUtil


import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.web.multipart.MultipartFile;import java.io.*;public class UploadUtil {public static void copyFile(MultipartFile file, File locFile) throws IOException {InputStream input = file.getInputStream();OutputStream output = new FileOutputStream(locFile);IOUtils.copy(input, output);output.close();input.close();}/**** @param requestUri 这个是数据库的url,如/res/file/get/signature/20200709114433.jpg* @param fileDir 这个是文件的实际存放地址,如D://ms_file* @return*/public static boolean delete(String requestUri, String fileDir) {String requestPath = "get";String path = requestUri.substring(requestUri.indexOf(requestPath) + 3);//File directory = new File(fileDir);//String tempPath = directory.getAbsolutePath() + path;String tempPath = fileDir + path;File deleteFile = new File(tempPath);return deleteFile.exists() ? deleteFile.delete() : false;}}

Base64ToPicture (这个是base64和图片互转的一个工具类)

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import java.io.*;
import java.util.Base64;
public class Base64ToPicture {/*** 将base64转成图片并存到指定文件夹* @param imgStrs* @param imgFilePath* @return*/public static boolean GenerateImage(String imgStrs, String imgFilePath) {// 对字节数组字符串进行Base64解码并生成图片if (imgStrs == null){// 图像数据为空return false;}int imgStrLen = imgStrs.length();String imgStr = imgStrs.substring(22,imgStrLen);//System.out.println(imgStr);BASE64Decoder decoder = new BASE64Decoder();try {// Base64解码byte[] bytes = decoder.decodeBuffer(imgStr);for (int i = 0; i < bytes.length; ++i) {if (bytes[i] < 0) {// 调整异常数据bytes[i] += 256;}}// 生成jpeg图片OutputStream out = new FileOutputStream(imgFilePath);out.write(bytes);out.flush();out.close();return true;} catch (Exception e) {return false;}}/*** 将图片文件转化为字节数组字符串,并对其进行Base64编码处理* @param imgFilePath* @return*/public static String GetImageStr(String imgFilePath) {//byte[] data = null;Base64.Decoder decoder = Base64.getDecoder();// 读取图片字节数组try {InputStream in = new FileInputStream(imgFilePath);data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {e.printStackTrace();}// 对字节数组Base64编码BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(data);// 返回Base64编码过的字节数组字符串}
}

2、看一下我的service吧

public Result save(ProjectFile projectFile, HttpServletRequest request){Result result = new Result();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");String fileAdd = sdf.format(new Date());//图片名称是  当前日期    避免数据重复String fileName = fileAdd  + ".jpg";//这个Base64ToPicture就是我们上面的工具类//这个步骤是把base64转成图片,并存在storeDir+"/signature/"+fileName这个目录下,这个storeDir是我们自己定义的,比如这个是D:/ms_file/signature/Base64ToPicture.GenerateImage(projectFile.getEncode(),storeDir+"/signature/"+fileName);//下面的步骤是给我们的数据库插入一条关于这个签名的记录,方便我们以后找到他String url = "/res/file/get/" + "signature" + "/" + fileName;projectFile.setId(UUIDTool.createUUID());projectFile.setUrl(url);projectFile.setCreateTime(new Date());projectFile.setFileType("jpg");projectFile.setType("signature");projectFile.setName(fileName);projectFileMapper.insert(projectFile);result.setMessage("签名成功!");result.setCode(1);return result;}

这个操作过后我们发现我们的数据库多了一条记录,数据库自己设计,在这里URL我存的是这样的格式的:/res/file/get/signature/20200709114433.jpg,其实我们的文件在D:\ms_file\signature\20200709114433.jpg,我们会发现这里没有指定是哪个盘,哪个文件夹下,反而多了/res/file/get/这串东西,大家别着急,这个是我们自己定义的。我们可以发现UploadFileAction 这个工具类里定义了@RequestMapping("/res/file"),get也是在UploadFileAction 里定义的。我们数据库要和这里保持一致性,大家可以随便定义;

3、查看我们的签名

先去数据库中查到我们需要的那条数据,拿到URL,就也是上面举例的/res/file/get/signature/20200709114433.jpg。
在页面中我们这样显示


http({data: {projectId:projectId,institutionsId:institutionsId},url: 'projectFile/queryByInstitutionsId',type: 'post',dataType: 'json',success: function(data) {that.signatureList = data;for(var i = 0;i<that.signatureList.length;i++){$("#imageList").append("<img src=http://127.0.0.1:7003" + that.signatureList[i].url + ">");}}
});

只需要拼接起来就好了,后台端口加我们的URL就可以了,它会去调用我们工具类中的get方法,从而显示出来。

这些工具类还可以用于图片上传。这个就放到下期吧!

jSignature签名的用法,一文教会你(二)后台代码相关推荐

  1. jSignature签名的用法,一文教会你(一)前端代码

    jSignature签名的用法 1.先看看效果以后最后它是什么格式的 2.先去下载该js 3.下载以后就把它引入我们的HTML中 4.看一下我的例子吧! 下期我们在讲,怎么把base64在后台处理,然 ...

  2. jSignature 签名时手写不出现笔迹,就是写不上字

    问题描述:微信访问H5网页A,在A页面首次加载后,签名功能正常使用,没有问题.当A页面跳转到B页面,B页面回退到A页面后,在A页面使用监听pageshow时间如果是缓存页面强制重新加载A页面,保证A页 ...

  3. jSignature签名和横向签名转至元数据结尾

    相关链接: GitHub - brinley/jSignature: jQuery plugin for adding web signature functionality 相关文件: jquery ...

  4. 关于jSignature签名时笔划偏移的问题

    在开发过程中发现,签名时,签名生成的轨迹与手指滑动的地方出现了偏移,经过重重调试,发现是样式出了问题,需要给父类div 的样式加上 display:block

  5. oracle 删除 queue,C++ stl队列Queue用法介绍:删除,插入等操作代码举例

    c++队列queue模板类的定义在头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型. C++队列Queue是一种容 ...

  6. php后台代码自动生成程序,Thinkphp自定义代码生成工具及用法说明(附下载地址)...

    本文实例讲述了Thinkphp自定义代码生成工具及用法说明.分享给大家供大家参考,具体如下: 我最近沮丧的发现在使用Thinkphp很多时候我都在做重复的事情,比如重复写最简单的CRUD方法,编写表单 ...

  7. hash签名 java_java开发区块链只需150行代码

    原标题:java开发区块链只需150行代码 本文帮助你理解什么是区块链.将通过java开发区块链的实战学习方式,用 Java创建开发一个基本的区块链,实现简单的工作量证明系统.Java开发区块链的源代 ...

  8. python返回值return用法_Python中return函数返回值代码实例用法

    本篇文章小编给大家分享一下Python中return函数返回值代码实例用法,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. return 添加返回值 r ...

  9. poscms清除html,poscms用法总结(非定制开发,不涉及后台代码)

    这些天几个企业站仿下来,对poscms的用法多少有些了解了,在这个记录一下,好记性不如烂笔头嘛. 1.静态文件目录和模板文件目录 这两个目录分别放置css/js/image等静态文件和html模板文件 ...

最新文章

  1. 录入学员的身份证后控件焦点转移时根据身份证号码获得生日和性别
  2. ACM北大暑期课培训第六天
  3. 【CF961G】Partitions(第二类斯特林数)
  4. Visual Studio 2005 移植 (札记之一)
  5. Linux工作笔记-使用find和grep检索文件或子文件中是否包含指定字符串
  6. 上海市职业介绍中心长宁分中心武夷路513-517号(021)62400032-229
  7. hun 暑期实训之打牌 cin与scanf的输入
  8. Squid 代理服务器
  9. mysql语句怎么拼接字符串_mysql字符串拼接
  10. Minecraft mod制作简易教程(一)——配置工作环境
  11. 前端开发:Vue项目中解决Emitted value instead of an instance of Error问题
  12. flink sql 知其所以然(二)| 自定义 redis 数据维表(附源码)
  13. 29. 尚融宝借款申请
  14. android --拍照相册选取图片[兼容小米等其他手机]
  15. 在web-actix框架上实现上传文件
  16. 鸿蒙os现在好用吗,全球首批!升级使用鸿蒙OS真实反馈评价出炉:差评/好评都很真实...
  17. 接口自动化测试平台Lego ------ 美团接口自动化测试超全实践【3000字长文】
  18. 超强配置 索爱A5无线蓝牙耳机重磅来袭
  19. 读《曾国藩》中义理之学的感悟
  20. amos 结构方程模型无法运行出来

热门文章

  1. mix2s android p功能,已升安卓P!网友:MIX2S才是亲儿子
  2. 大学生计算机社团该办什么活动,大学生社团活动策划方案
  3. android 工厂模式创建,7、Android设计模式---(创建型设计模式)抽象工厂模式
  4. 为什么说ip协议是无连接协议
  5. java中main缺少主体_缺少方法主体,或声明了摘要
  6. html中删除代码怎么写,html空格代码怎么写?
  7. Java 进栈出栈的过程
  8. Java 多个异常处理
  9. 家用使用计算机组装,不能再简单了!家用电脑DIY组装实操
  10. oracle11 处理器数,11G AWR中%Total CPU与%Busy CPU指标的疑问