https页面加载http资源的解决方法

news/2024/11/4 23:01:47/文章来源:https://www.cnblogs.com/bigcat26/p/18526926

@

目录
  • 1.报错如图
  • 2.项目背景
  • 3.网上的解决方案
  • 4.我的最终解决方案

1.报错如图

2.项目背景

我们的项目采用的全是https请求,而使用第三方文件管理器go-fastdfs,该文件管理器返回的所有下载文件的请求全是http开头的,比如http://10.110.38.253:11014/group1/batchImportData/组 (26).xlsx,然而在https请求下使用http的请求就会报如上图的错误,且不能把文件下载请求http改为https,因为修改后会查询不到文件。所以必须只能采用http的请求且想让功能实现。

注意点1:我们公司项目请求协议前缀必须是https的,执行http的无效

注意点2:这种第三方返回的文件下载路径http://10.110.38.253:11014/group1/batchImportData/组 (26).xlsx,是可以直接放在浏览器上直接下载的,具体请看如图

3.网上的解决方案

可以先看下其他人的博客,但是方案对我目前公司项目无效

1.https页面加载http资源的解决方法

2.分享 4个解决 https页面加载http资源报错的方法

问题:里面的方案为啥对我公司的项目无效?

答案:

  • 针对修改协议前缀的方案,我们的必须得是https的才行,其他无效。
  • 针对使用 iframe 的方案,因为没用过,且感觉项目引入会很费事且庞杂,所以当时没考虑该方案。
  • 针对自动升级方案(也就是说把第三方文件管理器go-fastdfs配置文件改了,由http协议改为https协议),该方案真对我的项目不行,因为我的公司有很多老项目都是用这个文件管理器go-fastdfs,如果把协议改了,不清楚对其他服务会不会有影响,所以轻易不能动。

综上所述:上面的方案我一个都不能用,所以我需要另想他法。

4.我的最终解决方案

接下来说下我最终想到的方便且容易上手的解决方案:那就是采用http工具执行url -> 然后把文件先下载到项目所在服务器的临时目录内 -> 然后再以读取普通文件路径的方式加载成File -> 再然后以流的方式输出给客户端弹窗另存为保存 -> 最后关闭流并删除服务器路径下的临时文件。

pom.xml

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version>
</dependency>
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.4.1</version>
</dependency>
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.17</version>
</dependency>       

前端js代码

//批量管理-下载批量导入数据
function downloadBatchImportDataTaskActionColumn(taskId) {var language = 'zh';if(Cookies.get("language") != null &&  Cookies.get("language") != ""){language = Cookies.get("language") ;}var url = prefix + "/downloadBatchImportData?language=" + language;var form = $("<form></form>").attr("action", url).attr("method", "post");form.append($("<input></input>").attr("type", "hidden").attr("name", "taskId").attr("value", taskId));form.appendTo('body').submit().remove();
}

后端Controller代码

/*** 下载批量导入数据* 流程:*      查询数据库判断filedownLink字段是否为空*          为空:则代表旧数据,没有gofd对应的下载文件地址,因此把模板文件返回给客户端*          不为空:则代表gofd已经上传了对应的批量导入文件,且数据库中保存地址链接*              通过filedownLink封装成FiLE*                  判断File在临时目录内是否存在*                      存在:则直接返回给客户端,最后再把服务器临时目录内文件删除*                      不存在:则通过http工具调用filedownLink封装成File,将文件写入tempFilePath临时目录内,再把文件File返回给客户端,最后再把服务器临时目录内文件删除* @param req req* @param response response*/@RequestMapping(value = "/downloadBatchImportData")public void downloadBatchImportData(HttpServletRequest req, HttpServletResponse response) {logger.info("-downloadBatchImportData-begin");String taskId = req.getParameter("taskId");OutputStream os = null;InputStream io = null;String tempFilePath = TEMP_FILE_PATH;String fileName = "";String language = req.getParameter("language");Workbook wb = null;try {ImpExpTaskDetail impExpTaskDetail = isvcBatchTaskServiceMicro.selectTaskDetailByTaskId(taskId);String filedownLink = impExpTaskDetail.getLink();if (org.springframework.util.StringUtils.isEmpty(filedownLink)) {fileName = MessageUtils.message("batch.template") + ".xlsx";String templateFileName = BatchConstant.DOWNAD_TEMPLATE_NAME + "_" + language + BatchConstant.EXTENSION_XLSX;SysUser sysUser = ShiroUtils.getSysUser();logger.info("-downloadBatchImportData-taskId:{},language:{}", taskId, language);if (isysUserService.get36kType(sysUser.getUserId()) == Poc36kEnum.POC6K.getType()) {templateFileName = BatchConstant.DOWNAD_TEMPLATE_NAME + "6k" + "_" + language + BatchConstant.EXTENSION_XLSX;}File templateFile = org.springframework.util.ResourceUtils.getFile("classpath:" + templateFileName);logger.info("-Template file exist!,templateFileName:{}", templateFileName);io = new FileInputStream(templateFile);wb = new XSSFWorkbook(io);} else {fileName = StringUtils.subscribeNameString(filedownLink);File file = ResourceUtils.getFile(String.join(File.separator, tempFilePath, fileName));if (!file.exists()) {String begin = DateUtil.now();DateTime beginTime = DateUtil.parse(begin);long download = HttpUtil.downloadFile(filedownLink, FileUtil.file(tempFilePath, fileName), new StreamProgress() {@Overridepublic void start() {logger.info("开始下载,时间为:" + begin);}@Overridepublic void progress(long progressSize) {logger.info("已下载:{}", FileUtil.readableFileSize(progressSize));}@Overridepublic void finish() {String end = DateUtil.now();DateTime endTime = DateUtil.parse(end);long between = DateUtil.between(beginTime, endTime, DateUnit.MS);logger.info("下载完成,用时:" + DateUtil.formatBetween(between, BetweenFormatter.Level.SECOND));}});}io = new FileInputStream(file);wb = new XSSFWorkbook(io);}logger.info("-tempFilePath:{},fileName:{}", tempFilePath, fileName);response.setContentType("application/octet-stream;charset=UTF-8");response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));wb.write(response.getOutputStream());} catch (IOException e) {logger.error("-downloadBatchImportData error:{}", e.getMessage());} finally {if (os != null) {try {os.close();} catch (IOException e) {logger.error("-OutputStream error:{}", e.getMessage());}}if (io != null) {try {io.close();} catch (IOException e) {logger.error("-InputStream error:{}", e.getMessage());}}if (Optional.ofNullable(tempFilePath).isPresent()) {// 强制删除临时文件boolean isDelete = com.hytalk.util.FileUtil.delFile(new File(tempFilePath));logger.info("-downloadBatchImportData 强制删除临时文件 , filePath: {} , isDelete : {} ", tempFilePath, isDelete);}}}

FileUtil工具类

import java.io.File;/*** 文件工具* @Author 211145187* @Date 2023/4/19 14:27**/
public class FileUtil {/*** 删除文件* @param file 文件* @return boolean*/public static boolean delFile(File file) {if (!file.exists()) {return false;}if (file.isDirectory()) {File[] files = file.listFiles();for (File f : files) {delFile(f);}}return file.delete();}
}

StringUtils工具类

/*** 字符串工具* @author 211145187* @Date: 2021/11/11 16:11**/
public class StringUtils {/*** 截取url地址中的名称,比如路径地址为“http://10.110.38.253:11014/group1/batchImportData/组 (26).xlsx”,最后截取的名称为“组 (26).xlsx”* @param str 原字符串* @return 截取后的字符串*/public static String subscribeNameString(String str) {if (str.lastIndexOf("/") > -1) {str = str.substring(str.lastIndexOf("/") + 1);}return str;}
}

说明:

只在意我的思路流程即可,至于工具类或者查数据库数据代码啥的就不复制粘贴了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/826854.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载

Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载@目录一、业务背景二、实现思路二、准备工作1.准备data模板.xlsx2.引入poi相关依赖,用于操作excel3.针对WorkBook+ZIP压缩输入/输出流,相关方法知识点要有所了解三、完整的项目代码四、可能遇到的问题错误场景…

macOS 解锁隐藏文件

不知道为什么,我用 VS Code 编译的 LaTeX 文档是隐藏的,导致我复制到其他地方都看不见这个文档。首先可以按下 Command + Shift + . 组合键显示隐藏文件。接下来可以用下面的命令取消隐藏的文件: chflags nohidden <file>如果你想重新隐藏的话,使用下面的命令: chfl…

Spring原理Boot

Spring原理 SpringBoot 1 Boot 1.1 Boot 骨架项目 如果是 linux 环境,用以下命令即可获取 spring boot 的骨架 pom.xml curl -G https://start.spring.io/pom.xml -d dependencies=web,mysql,mybatis -o pom.xml也可以使用 Postman 等工具实现 若想获取更多用法,请参考 curl …

0xGame 2024 [Week 2] 报告哈基米

0xGame 2024 [Week 2] 报告哈基米 新知识:Tupper(塔珀自指公式);Arnold Cat(猫映射) 下载文件是一个png图片,010打开查看 发现是倒着的pk转一下保存为zip文件,打开后是一个txt文件有两个地方有提示,一个是十六进制里面的Maybe You Need To Kown Arnold Cat?还有一个是…

告别 PPT 配图难题!Napkin.ai 轻松打造生动演示文档(文末免费送书)

还在为 PPT 配图发愁?Napkin.ai 来救场!它是强大的文本自动配图工具,能自动摘要文本、生成并自定义配图,下载方式多样。文中详细介绍其使用方法,包括注册、创建 Napkin、选择和设置配图等。此外,还有免费送书活动,关注、留言点赞就有机会获得《OpenAI API 接口应用实战》…

Origin pro 2024下载与安装

1、安装包 OriginPro 是由 OriginLab 公司开发的专业制图和数据分析软件,大部分科学研究的统计、作图、函数拟合等要求都可以满足,尤其适合曲线、曲面的图。它提供了上百种二维和三维绘图模板,而且允许用户自己定制模板。OriginPro 中的数据分析功能包括统计,信号处理,曲线…

20222323 2024-2025-1 《网络与系统攻防技术》实验四实验报告

1.实验内容 一、恶意代码文件类型标识、脱壳与字符串提取 对提供的rada恶意代码样本,进行文件类型识别,脱壳与字符串提取,以获得rada恶意代码的编写作者,具体操作如下: (1)使用文件格式和类型识别工具,给出rada恶意代码样本的文件格式、运行平台和加壳工具; (2)使用…

如何计算并联谐振电路中电感和电容的电流

(附:可以验证一下电容的容抗计算,假设在1kHz(其他频率电容值会变)时计算470uF的容抗为2x3.14x10^3 x470x10^-6约等于0.339欧)

C# windos服务的安装与卸载

注:需要使用管理员权限打开 使用命令窗口安装服务使用命令窗口卸载服务 使用 PowerShell安装服务 与命令窗口区别在于需要加上 ./ 卸载也是如此

【GiraKoo】WSLg,x11下鼠标显示超大问题对策

WSLg,x11下,显示鼠标尺寸过大的问题【GiraKoo】WSLg下鼠标显示超大问题对策 环境Windows 10,11 WSLg x11 4K显示屏现象在wslg下,打开Android Studio客户端,鼠标显示过大。原因 从环境猜测,应当是x11转发导致的问题。 对策在~/.bashrc中添加以下内容:export XCURSOR_SIZE=2…

CSP-J2024扑克牌

#include <bits/stdc++.h> using namespace std; int main() {int n;map<string,int> a;string x;cin>>n;int sum = 0;for(int i = 1;i<=n;i++){cin>>x;if(a[x]==0){sum++;}a[x]++;}cout<<52-sum;return 0; }