Java程序部署到服务器上,接口请求下载文件失败/文件为空/文件名不对的问题
作者:Oxye 发布时间:2023-05-12 15:30:00
1.问题:
昨天把项目打包放到国产中间件东方通(外部容器,功能类似Tomcat)上时,发现某些请求下载文件的接口不能正确返回文件,而是返回一个空的文件,名称是接口名最后一个词fj,
然而这个功能直接使用IDE启动时没问题的,打包放到Tomcat9上也没问题,那可能是东方通适配问题了
2.原代码:
部署在服务器上系统以后,在线打断点,发现跑到这一部分就在第三行位置执行不下去
response.setContentType("application/force-download");
response.setCharacterEncoding("utf-8");
response.setContentLengthLong(fileMetaData.getSize());
response.setHeader("Content-Disposition", "attachment;filename=" + encodeChineseDownloadFileName(request, qualifiedFileName));
3.错误原因:
servlet-api.jar 版本问题,系统使用了新版本的方法,东方通上旧版本jar没这个方法
4.解决
response是HttpServletResponse类型的,
看一下这个类在哪:javax\servlet\javax.servlet-api\4.0.1\javax.servlet-api-4.0.1.jar!\javax\servlet\http\HttpServletResponse.class
发现这个类是javax.servlet-api-4.0.1.jar包里的类
我在迁移系统到TongWeb上的时候,做了一些jar包改动,依稀记得看到过lib下使用的是servlet-api.jar
我把jar下下来,压缩文件打开,去寻找此类,发现这些文件都是2012年的,说明这版东方通使用的servlet-api版本老
使用IDEA打开class,在structure中查看,发现我们代码中用到的方法只有setHeader
再看一下集成的接口ServletResponse,发现只找到setContentType、setCharacterEncoding
看一下程序依赖的版本,好吧,新版本有这个方法
5.新代码:
去掉这一行,接口返回正确的文件
response.setContentType("application/force-download");
response.setCharacterEncoding("utf-8");
//response.setContentLengthLong(fileMetaData.getSize());
response.setHeader("Content-Disposition", "attachment;filename=" + encodeChineseDownloadFileName(request, qualifiedFileName));
来源:https://blog.csdn.net/weixin_43859729/article/details/107253205


猜你喜欢
- Servlet1 Servlet 简介Servlet就是Sun 公司开发动态web的一门技术Sun在这些API中提供一个接口叫做:Servl
- 引言在实际分布式项目中延迟任务一般不会使用JDK自带的延迟队列,因为它是基于JVM内存存储,没有持久化操作,所以当服务重启后就会丢失任务。在
- 本节讲运行在后台服务里的工作请求,如何向发送请求者报告状态。推荐用LocalBroadcastManager发送和接收状态,它限制了只有本a
- 在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备
- 单例模式有一下特点:1、单例类只能有一个实例。2、单例类必须自己自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。单例模式确
- 一、Hadoop的安装1. 下载地址:https://archive.apache.org/dist/hadoop/common/我下载的是
- 本文实例讲述了C#使用HtmlAgilityPack抓取糗事百科内容的方法。分享给大家供大家参考。具体实现方法如下:Console.Writ
- 前言在上一篇通知服务NotificationListenerService使用方法 中,我们已经介绍了如何使用NotificationLis
- 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下:public class Sample1 {  
- 关于Maven的使用就不再啰嗦了,网上很多,并且这么多年变化也不大,这里仅介绍怎么搭建Hadoop的开发环境。1. 首先创建工程mvn ar
- 本文实例为大家分享了android自定义波浪加载动画的具体代码,供大家参考,具体内容如下效果图1.自定义控件 WaveViewpackage
- 本文实例为大家分享了C#二维码图片识别的具体代码,供大家参考,具体内容如下怎么用NuGet和怎么配置log4net就不介绍了,直接上代码(V
- 一 为什么要使用线程池对于操作系统而言,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换时要执行内存换页,清空
- 本文实例展示了WinForm项目开发中NPOI用法,对于C#初学者有一定的借鉴价值。具体实例如下:private void ExportMe
- 百度是个好东西,这篇调用了百度的接口(当然大牛也可以自己写),人脸检测技术,所以使用的前提是有网的情况下。当然大家也可以去参考百度的文档。话
- 我们用一个简单的例子,来说明一下这种消息传递的机制。有一家三口,妈妈负责做饭,爸爸和孩子负责吃。。。将这三个人,想象成三个类。妈妈有一个方法
- 本文实例为大家分享了Springboot POI导出Excel的具体代码,供大家参考,具体内容如下需求:页面根据查询条件导出(浏览器)由于本
- 1、特效按钮的进展 之前的思路:css设置div的样式,在js中实现div对事件的响应,并改变div的样式,以实现动画效果。 1:以动画的形
- 目录概述基本使用1. 在低层 module_common 中声明服务2. 在上层 module 中实现服务3. 在其它上层 module 中
- 一、常见问题所有的final修饰的字段都是编译期常量吗?如何理解private所修饰的方法是隐式的final?说说final类型的类如何拓展