点击文字,下载图片或者文件

php 图片加文字点击按钮下载 接上一篇,实现点击按钮下载 image.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>image</title> </head> <body> <div> <img src="/index/image/image" style="width: 100%" /> <a href="/in 阅读详情

在一个前后端分离的项目上,有一个需求,点击文字,下载相应的图片或是文件。折腾了两天,还是在后台处理好图片或是文件,返回给前台来的实际。

效果图:

而且鼠标放上去是小手的样式。

html:

<div v-if="item.controlType === 5" style="display:inline-block;width: 300px">
    <i v-if="item.value"
       v-for="file in item.fileList"
       class="el-icon-picture-outline" style="margin-right: 10px;cursor:pointer;color: blue"
       @click="downLoad(file)">
                点击下载
    </i>
</div>

 看见了吧,要是<a>标签放上去时候肯定变小手形状,但是<li>标签,那就加个样式

cursor:pointer

就ok了。

回到正题,js:

      //下载图片/文件
      downLoad(id) {
        var loading = appUtils.showLoading()
        //这层是为了查文件名,给download属性赋值
        file.getFiles({'ids': id}, res => {
          if (res.state) {
            this.imageName = res.data[0].name
            //下面才是下载后台的图片或者文件
            var url = config.baseUrl + 'file/downLoad'
            fetch(url, {
              method: 'POST',
              body: JSON.stringify({'id': id}),
              headers: new Headers({
                'Content-Type': 'application/json',
                'token': dataUtils.getData(config.key.tokenKey) // 指定提交方式为表单提交
              }),
            }).then(res => res.blob().then(blob => {
              if (res.status) {
                appUtils.hideLoading(loading)
                var a = document.createElement('a')
                var url = window.URL.createObjectURL(blob)
                var filename = this.imageName
                a.href = url
                a.download = filename
                a.click()
                window.URL.revokeObjectURL(url)
              }
            }))
          } else {
            appUtils.showError(res.msg)
          }
        })
      },

 

java:

/**
 * 下载文件
 *
 * @param file
 * @param request
 * @param response
*/
@RequestMapping("downLoad")
public void downLoad(@RequestBody FileDO file, HttpServletRequest request, HttpServletResponse response) {
   try {
        file = service.get(file);
        String url = "/target/classes/static/img" + file.getUrl();
        //将虚拟路径转换物理路径
        String baseUrl = DownLoadUtil.getPysicalPath(url, request);
        //下载文件
        DownLoadUtil.downFile(baseUrl, "", request, response);
        } catch (Exception e) {
            logger.error(e.toString());
        }
    }
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.DefaultResourceLoader;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

/**
 * 下载工具类
 *
 * @author
 */
@Slf4j
public class DownLoadUtil {

    private static final String FIREFOX = "Firefox";
    private static final String CHROME = "Chrome";

    /**
     * @param @param  request
     * @param @param  pFileName
     * @param @return
     * @param @throws UnsupportedEncodingException
     * @return String
     * @throws
     * @Title: encodeChineseDownloadFileName
     */
    public static String encodeChineseDownloadFileName(HttpServletRequest request, String pFileName)
            throws UnsupportedEncodingException {
        String filename = null;
        String agent = request.getHeader("USER-AGENT");
        if (null != agent) {
            if (-1 != agent.indexOf(FIREFOX)) {
                filename = "=?UTF-8?B?" + (new String(org.apache.commons.codec.binary.Base64.encodeBase64(pFileName.getBytes("UTF-8")))) + "?=";
            } else if (-1 != agent.indexOf(CHROME)) {
                filename = new String(pFileName.getBytes(), "ISO8859-1");
            } else {
                filename = java.net.URLEncoder.encode(pFileName, "UTF-8");
                filename = StringUtils.replace(filename, "+", "%20");
            }
        } else {
            filename = pFileName;
        }
        return filename;
    }

    public static String getPysicalPath(String virtualPath, HttpServletRequest request) {
        //获得根绝对路径
        String physicalPath = getProjectPath();
        //获得项目路径
        String basePath = request.getContextPath();
        if (virtualPath.startsWith(basePath)) {
            virtualPath = virtualPath.substring(basePath.length());
        }
        return physicalPath + virtualPath;
    }

    /**
     * @param @param url文件url
     * @param @param fileName  文件名
     * @param @param response
     * @return void
     * @throws
     * @Title: downFile
     * @Description:
     */
    public static void downFile(String url, String fileName, HttpServletRequest request, HttpServletResponse response) {
        FileInputStream in = null;
        OutputStream out = null;
        try {
            //获得文件
            File file = new File(url);
            if (file.exists()) {
                //1.定义ContentType为("multipart/form-data")让浏览器自己解析文件格式
                response.setContentType("multipart/form-data");
                if (StringUtils.isNotBlank(fileName)) {
                    //2.中文名转码
                    response.setHeader("Content-disposition", "attachment; filename=\"" + encodeChineseDownloadFileName(request, fileName + ".xlsx") + "\"");
                } else {
                    response.setHeader("Content-disposition", "attachment; filename=" + file.getName() + "");
                }
                in = new FileInputStream(file);
                //3.将文件写入缓冲区OutputStream(out)
                out = new BufferedOutputStream(response.getOutputStream());
                int b = 0;
                byte[] buffer = new byte[2048];
                while ((b = in.read(buffer)) != -1) {
                    //4.将缓冲区文件输出到客户端(out)
                    out.write(buffer, 0, b);
                }
                in.close();
                out.flush();
                out.close();
            } else {
                log.error("文件不存在");
            }
        } catch (Exception e) {
            log.error("下载文件出错:" + e.getMessage());
            e.printStackTrace();
        } finally {
            if (in != null) {
                in = null;
            }
            if (out != null) {
                out = null;
            }
        }
    }

    /**
     * 获取工程项目根路径
     *
     * @return
     */
    public static String getProjectPath() {
        // 如果配置了工程路径,则直接返回,否则自动获取。
        //BaseConfig.PROJECT_PATH;
        String projectPath = null;
        if (StringUtils.isNotBlank(projectPath)) {
            return projectPath;
        }
        try {
            File file = new DefaultResourceLoader().getResource("").getFile();
            if (file != null) {
                while (true) {
                    File f = new File(file.getPath() + File.separator + "src" + File.separator + "main");
                    if (f == null || f.exists()) {
                        break;
                    }
                    if (file.getParentFile() != null) {
                        file = file.getParentFile();
                    } else {
                        break;
                    }
                }
                projectPath = file.toString();
            }
        } catch (IOException e) {
            log.error("获取项目根目录出错:" + e.getMessage());
            e.printStackTrace();
        }
        return projectPath;
    }

    public static void main(String[] arg) {
        System.out.println(getProjectPath());
    }
}

 

 

 

WPS PDF提取图片文字教程 通过本文的介绍,相信你已经掌握了如何使用WPS PDF提取图片文字的方法。WPS PDF提供了快速、准确、方便的文字提取功能,可以帮助你轻松应对各种PDF文档处理需求。无论是学习、工作还是生活中遇到的PDF文档问题,WPS PDF都能为你提供有效的解决方案。希望本文对你有所帮助! 阅读详情

相关推荐

内部威胁论文阅读笔记(CMU-CERT专场)

在网上看了很多介绍该数据集的博客,一直有个疑问,这个数据集的标注在哪,本着先入为主的想法结合现有的资料对这个数据集的结构做了一下猜测(可能还是不严谨和正确)1.标注在哪2.什么是密集针模型3.场景文章连接内部人员由于可以绕过安全检测发起攻击,通常最有害的攻击被认为是内部人员发起。通过分析用户行为来检测内部威胁,主要分析一些类时间和活动进行特征选择。选择特征向量用于训练。采用cmu-certr4.2用于训练。提出的算法与。

Jerry的博客 2802

【原创】url转字节码导出压缩包

下面展示一些 内联代码片。 public void exportBatch(HttpServletResponse response,HttpServletRequest request,List<String> urls) { try { UrlFilesToZip s = new UrlFilesToZip(); List<ByteFileBean> fileBeans = new ArrayList<&gt

weixin_44737409的博客 413

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析

本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。

weixin_29165465的博客 392

js点击按钮下载图片或文件

js点击按钮下载图片或文件

weixin_68658847的博客 3964

Allegro规则管理器实战:5步搞定Xnet等长组设置(含Relative Propagation Delay配置)

本文详细介绍了在Cadence Allegro规则管理器中,通过5个实战步骤高效设置Xnet等长组的方法。核心内容包括创建Xnet属性、定义引脚对、建立匹配组,并重点讲解了Relative Propagation Delay规则的配置与应用,帮助PCB设计师确保高速信号时序对齐,提升系统稳定性与性能。

weixin_29193259的博客 517

深入解析JESD204B Periodic SYSREF在多ADC/DAC系统中的同步优化策略

本文深入探讨了JESD204B Periodic SYSREF在多ADC/DAC系统中的同步优化策略,针对雷达阵列和宽带通信系统中的同步精度问题,详细解析了硬件实现细节、参数配置实战经验及系统级优化方法。通过案例分析和技术要点,帮助工程师解决由温度漂移和时钟抖动引起的同步挑战,提升系统性能。

weixin_29267307的博客 137

解决在谷歌浏览器下载时文件名包含逗号导致页面显示网页不可用问题

该问题是谷歌浏览器的一个bug,因此我们设置响应头时,对于filename加上引号处理 设置响应头Content-Disposition中实际效果如:content-disposition=attachment;fileName="原文件名称"

后端开发 1782

RK3588 部署 YOLO26 目标检测:PT → ONNX → RKNN 全流程

YOLO26n 在 RK3588 上 INT8 量化后 NPU 推理约 15ms,系统 FPS 约 55,可以覆盖边缘端实时检测需求。模型从 PT 到 RKNN 的转换要用opset=11避免算子兼容问题。先用 YOLO26n + 640 输入跑通全链路,确认推理结果正确后再做性能调优。

m0_64661770的博客 304

解决浏览器下载附件乱码问题 IE11

/** * @Title:encodeChineseDownloadFileName * @Description TODO(解决浏览器下载附件乱码问题). * @date 2016年8月19日 * @author lzqiangPC * @param pFileName * @return * @throws Exception

liuqiang211的专栏 3168

130页5万字某市档案馆数字档案馆建设方案

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除!完整资料领取见文末,部分资料内容:国家档案局证实颁布《数字档案馆建设指南》, 明确了数字档案馆建设原则、要求、目标,对相关系统建设内容、功能要求进行了概括和详细说明。数字档案馆系统建设应以 OAIS&nbsp;参考模型为设计基础,以实现数字资源的长期保存与可信管理。设计的数字档案馆系统架构如下图。图-1 数字档案馆体系结构数字档案馆建设包括五大层次和三大保障体系:

zuoan1993的博客 1180

PVE虚拟机运行不流畅,出现卡顿。

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 3063

原生input文件上传、预览、下载

HTML <input type="file" @change="getFile" /> JS async getFile (e) { if (!e.target || !e.target.files) { return } for (let i = 0; i < e.target.files.length; i++) { let file = e.target.files[i] if (

风吹过的博客 1569

深入剖析 Hive 中 CASE WHEN 与 IF 函数的性能差异:解锁高效数据处理的关键

CASE WHEN 函数堪称 Hive 中条件判断的多面手,它具备两种强大的语法形式,以应对各种复杂的业务逻辑。简单 CASE 表达式这种形式适用于对某一列的值进行直接的条件匹配。其语法如下:END例如,我们有一个记录学生成绩的表CASE scoreELSE 'D'搜索 CASE 表达式当业务逻辑需要更灵活的条件判断时,搜索 CASE 表达式便派上用场。它的语法为:CASEENDCASEELSE 'D'

2401_83088008的博客 1125

【Python • 图片识别】pytesseract快速识别提取图片中的文字

随着人工智能和计算机视觉技术的快速发展,图片识别技术已经成为现代软件开发中的一个重要方向。无论是自动驾驶、安防监控,还是文档扫描识别,图片识别技术都发挥着至关重要的作用。在这一领域,OCR(Optical Character Recognition,光学字符识别)技术是核心,而Tesseract OCR引擎是目前最为流行和强大的开源OCR引擎之一。对于Python开发者来说,要实现OCR功能,pytesseract是一个非常便捷的工具。

专注Rust编程与技术分享,涵盖C++、Python等开发实战,新手友好,专注实战,助力编程成长。 14万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java + html 图片点击文字验证码

图片点击文字验证码

qq_20025777的博客 889

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java实现点击中文文字图片验证码

Java实现点击中文文字图片验证码 环境条件 JDK1.8 MAVEN-3.3 spring-boot-2.1.17.RELEASE 点击中文文字验证码思路(跟点击图标思路一致,只是背景图写文字改为画图标) 文件夹放置尺寸大小一致的背景图,支持可配置的文件夹路径和容错的默认路径. 项目启动完成时一次性全部图片转为字节或Base64缓存起来(可改为redis);前端请求图片验证码时候在随机取缓存中的一张背景图片。 根据配置生成固定个数的随机宋体中文文字(记住LINUX得安装宋体字库),在根

m0_38138879的博客 2347

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

提取 PDF 文件中的文字以及图片中的文字

](https://www.cisdem.com/resource/extracttextfrompdfimage.html)[](https://help.illinoisstate.edu/accessibility/websiteanddigital/pdfaccessibilitywithadobeacrobatpro/convertanimageonlypdfwithtextrecognitioninadobeacrobatpro)3. 扫描完成后,可以选择提取文字,编辑或分享到其他应用程序。

nbspzs的专栏 3061

java读取图片文字

java自动读取图片文字信息代码片工具类 java中识别文字使用的软件是tesseractocr(使用的版本是3.02,3以后的版本才支持中文),这个软件需要安装在本地电脑中,安装的过程中全部都按照默认进行安装(以便于Java直接调用), 想要完整的程序私信我 ,打包下载完成后导入即可运行测试。 代码片 代码片. public class ImageIOHelper { //设置语言 ...

qq_35571894的博客 6368

运用canvas将两张图片画在一起,生成一张新的图片,然后实现点击下载图片

运用canvas将两张图片img1,img2画在一起,生成一张新的图片img3,然后实现点击下载图片img3   代码如下: &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Title&lt;/title&am

前端小小白的爬坑之路 4814

canvas绘制图片二维码+文字+背景 下载到本地

闲来无事,以下自己写了个小demo,丰富canvas下载到本地的图片内容,可以添加照片,描述文字,背景样式等…之前写过下载二维码的需求,需求简单,只要能下载就行,但是下载到本地就一个纯二维码的小图片,感觉不怎么美观。

Program Apes 2129

图片文字识别教程

图片文字识别教程图片文字识别在线文字识别一: 图片转txt二:图片+pdf 转txt三:图片+pdf 转txt离线文字识别OneNote2016笔记编辑工具文字识别一:软件下载+安装+激活二:如何使用软件 识别图片文字和pdf 文字<1>图片文字识别<1>pdf文字识别 图片文字识别 在线文字识别 一: 图片转txt 网址: OCR image to txt 如图:点击左边...

极客代码-极致生活 3501

python进行批量图片文字识别

概述 一、环境准备: 1.python环境的准备 2.百度云api的注册 二、实现: 1. 三、总结:

m0_60352504的博客 7824

Python识别图片中的文字

Python识别图片中的文字 一、前言 不知道大家有没有遇到过这样的问题,就是在某个软件或者某个网页里面有一篇文章,你非常喜欢,但是不能复制。或者像百度文档一样,只能复制一部分,这个时候我们就会选择截图保存。但是当我们想用到里面的文字时,还是要一个字一个字打出来。那么我们能不能直接识别图片中的文字呢?答案是肯定的。 二、Tesseract 文字识别是ORC的一部分内容,ORC的意思是光学字符识别,通俗讲就是文字识别。Tesseract是一个用于文字识别的工具,我们结合Python使用可以很快的实现文

小菜鸡也要敲代码的博客 2893

基于MATLAB的图片中文字提取及识别资源下载

基于MATLAB的图片中文字提取及识别资源下载 去发现同类优质开源项目:https://gitcode.com/ 本仓库提供了一个名为“基于MATLAB的图片中文字的提取及识别(精).pdf”的资源文件下载。该文件详细介绍了如何使用MATLAB实现图片中文字的提取及识别(OCR)技术。 资源描述 “基于MATLAB的图片中文字的提取及识别(精).pdf”是一份详细的教程文档,主要内容包括: MA...

gitblog_06698的博客 588

python 调用 百度ocr_文字识别接口,识别图片上的文字

今天试用了一下 百度ocr_文字识别 功能。 我的想法是用python编程的方式调用 百度ocr_文字识别 ,上传一幅图片,识别图片上的文字 整个过程不难,这里将一些关键点记录下来。 第一步 注册或登陆百度云账号,创建百度应用 进入“百度云”的控制台,如下所示: 点击左侧导航栏中的“文字识别” 然后“创建应用” 创建应用的目的是为了生成三个字符串: appId, apiKey, secret...

littlezhuhui的专栏 4695

文件下载图片或者视频及解决保存文件时中文乱码问题

文件下载需求: 页面显示超链接 点击超链接后弹出下载提示框 完成图片文件下载 分析: 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求(所以要在a标签中使用?) 任何资源都必须弹出下载提示框 使用响应头设置资源的打开方式: content-disposition:attachment;filename=xxx(设置这个头后,浏览器就不会直接解释图片打开了,而是以附件的形式保存) 步骤: 定义页面,编辑超链接href属性,指向Servlet,传递资源

Alla 1854
上一篇: java 增强for循环对于空集和null的判断
下一篇: vue过滤器的使用
goodStudy_H
博客等级 码龄8年 26粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值