【正式开始前的唠嗑】——春节假期还是如期而终,各位小伙伴是不是和我一样患上了“假期综合症”呢?工作状态简直太差了!博客也好久没写了,现在来总结总结struts2中文件的下载和上传!
Part1——文件下载
struts2提供了stream结果类型专门用于支持文件下载,指定stream结果类型时需指定一个inputName参数,该参数指定了一个被下载文件的入口的输入流。
下载页面:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Struts 2的文件下载</title> </head> <body> <h1>Struts 2的文件下载</h1> <ul> <li> 下载图片: <a href="download.action">下载图形文件</a> </li> </ul> </body> </html>
相应的Action:
public class FileDownloadAction extends ActionSupport { // 该成员变量可以在配置文件中动态指定该值 private String inputPath; // inputPath的setter方法 public void setInputPath(String value) { inputPath = value; } /* 定义一个返回InputStream的方法,用于被下载文件的入口, 且需要配置stream类型结果时指定inputName参数, inputName参数的值就是方法去掉get前缀、首字母小写的字符串 */ public InputStream getDownloadFile() throws Exception { // ServletContext提供getResourceAsStream()方法 // 返回指定文件对应的输入流 return ServletActionContext.getServletContext() .getResourceAsStream(inputPath); } }
struts.xml中的配置:
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 配置Struts 2应用的字符集 --> <constant name="struts.i18n.encoding" value="GBK"/> <package name="lee" extends="struts-default"> <action name="download" class="org.crazyit.app.action.FileDownloadAction"> <!-- 指定被下载资源的位置 --> <param name="inputPath">/WEB-INF/images/疯狂联盟.jpg</param> <!-- 配置结果类型为stream的结果 --> <result name="success" type="stream"> <!-- 指定下载文件的文件类型 --> <param name="contentType">image/jpg</param> <!-- 指定由getDownloadFile()方法返回被下载文件的InputStream --> <param name="inputName">downloadFile</param> <param name="contentDisposition">filename="wjc_logo.jpg"</param> <!-- 指定下载文件的缓冲大小 --> <param name="bufferSize">4096</param> </result> </action> </package> </struts>
注:1)contentType还包括诸如application/zip(压缩类型)、text/html(文本类型)等
2)contentDisposition默认是inline(内联)的,默认情况下,文本、图片等文件会在网页中直接打开,压缩文件才会弹出保存对话框;修改成attachment;fileName="${filename}"才会无论啥类型的文件都会弹出保存询问对话框。
3)如果想要在用户下载之前进行权限检查,就必须要让struts2来控制下载——例如可以根据ActionContext的getSession()方法取出HttpSession,透过session判断当前用户是否有下载权限,如果没有跳转到相应的处理页面(如登录、注册等),相应地,必须在struts.xml配置。
Part2——文件上传
struts2的文件上传更是比较常见的使用情况。
上传页面实例:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>简单的文件上传</title> </head> <body> <s:form action="upload" enctype="multipart/form-data"> <s:textfield name="title" label="文件标题"/> <s:file name="upload" label="选择文件"/> <s:submit value="上传"/> </s:form> </body> </html>
相应地Action:
public class UploadAction extends ActionSupport { // 封装文件标题请求参数的属性 private String title; // 封装上传文件域的属性 private File upload; // 封装上传文件类型的属性 private String uploadContentType; // 封装上传文件名的属性 private String uploadFileName; // 直接在struts.xml文件中配置的属性 private String savePath; // 接受struts.xml文件配置值的方法 public void setSavePath(String value) { this.savePath = value; } // 获取上传文件的保存位置 private String getSavePath() throws Exception { return ServletActionContext.getServletContext() .getRealPath(savePath); } // 各属性的setter和getter方法。。。 @Override public String execute() throws Exception { // 以服务器的文件保存地址和原文件名建立上传文件输出流 FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName()); FileInputStream fis = new FileInputStream(getUpload()); byte[] buffer = new byte[1024]; int len = 0; while ((len = fis.read(buffer)) > 0) { fos.write(buffer , 0 , len); } fos.close(); return SUCCESS; } }
struts.xml配置:
<struts> <!-- 设置该应用使用的字符集 --> <constant name="struts.i18n.encoding" value="GBK"/> <package name="lee" extends="struts-default"> <!-- 配置处理文件上传的Action --> <action name="upload" class="org.crazyit.app.action.UploadAction"> <!-- 动态设置Action的属性值 --> <param name="savePath">/uploadFiles</param> <!-- 配置Struts 2默认的视图页面 --> <result>/WEB-INF/content/succ.jsp</result> </action> </package> </struts>
注:1)关于文件上传的容量控制可在struts.xml中(全局:<constant name="struts.multipart.maxSize" value="20000" />;局部写在拦截器中:<param name="maxmumSize">20000</param>)或struts.properties中指定;
2)处理上传的Action必须定义三个private属性: xxx, xxxFileName, xxxContentType, 其中xxx与上传页面的<s:file name="upload" label="选择文件"/>name属性值必须对应。同时不要忘记着三个属性的getter/setter方法。否则不一致的话会获取不到
3)可在配置文件中为上传的action配置拦截器(被该Action配置包围),配置允许上传的文件类型和文件大小等信息。
相关推荐
基于transUnet和swinUnet的医学图像分割项目实验对比,包含完整代码,可以一键运行。评估指标包括dice、iou、recall、precision等
,stm32f030无感foc方案,资料包括原理图,pcb,源程序,观测器参数,电流环参数计算表格。
分布式电源DG选址定容优化及帕累托最优解集的粒子群算法研究,多目标粒子群算法 分布式电源 DG 定容选址 网损 成本 电压偏差 通过分布式能源的选址定容确定得到帕累托最优解集,然后选择最优值进行分析,程序采用改进粒子群算法, ,核心关键词:多目标粒子群算法; 分布式电源选址定容; 网损; 成本; 电压偏差; 帕累托最优解集。,改进粒子群算法在分布式电源选址定容中的应用:优化网损与成本,考虑电压偏差
交变磁场感应材料对沥青路面温度影响的研究,交变磁场下含感应材料沥青路面温度 ,交变磁场; 感应材料; 沥青路面; 温度; 变化; 加热效率,交变磁场对含感应材料沥青路面温度的影响研究
基于Comsol模拟的三层顶板随机裂隙浆液扩散模型:考虑重力影响的瞬态扩散规律分析,Comsol模拟,考虑三层顶板包含随机裂隙的浆液扩散模型,考虑浆液重力的影响,模型采用的DFN插件建立随机裂隙,采用达西定律模块中的储水模型为控制方程,分析不同注浆压力条件下的浆液扩散规律,建立瞬态模型 ,Comsol模拟; 随机裂隙浆液扩散模型; 浆液重力影响; DFN插件; 达西定律模块储水模型; 注浆压力条件; 浆液扩散规律; 瞬态模型,Comsol浆液扩散模型:随机裂隙下考虑重力的瞬态扩散分析
对于Sqlserver数据库只是提供了简单的图形化的导出导入工具,在实际的开发和生产环境不太可能让用户在图形化的界面选择移行的对象,进行移行。 我们在数据库的移行中也遇到这种问题,需要提供一个工具给客户使用。所以我们开发了针对SQLServer数据库的cmd形式导入导出的工具。在长期的实践中不断完善,基本可以实现Oracle的导入导出工具的80%的功能,也比较的稳定。有需要的可以下载使用,也可以提供定制化的服务
内容概要:本文介绍了DeepSeek模型在不同平台上部署的方法。首先阐述了基于Ollama的本地部署,包括Ollama的安装、模型拉取以及交互模式的使用。接着讲解了DeepSeek在移动设备(iOS和Android)上的部署细节:iPhone需要通过Safari安装快捷指令,配置API Key并通过快捷指令测试运行;Android则借助Termux安装必要组件,并手动搭建Ollama环境以加载和测试模型。最后详细叙述了基于Open WebUI部署的方式,涉及Ollama、Docker Desktop及Open WebUI的安装流程及其之间的配合使用来最终达成模型的成功部署。 适用人群:面向有兴趣了解或者实际操作DeepSeek模型跨平台部署的技术开发者、研究人员以及AI爱好者。 使用场景及目标:适用于希望利用DeepSeek模型快速构建本地化应用程序、开展实验研究的用户;具体目标为掌握DeepSeek模型在桌面系统(如Linux、macOS、Windows)、iOS和Android智能手机以及云端WebUI界面上的不同部署手段和技术。 其他说明:对于每种类型的部署都提供了详细的步骤指导,旨在帮助使用者顺利完成所需工具和环境的安装,并确保模型能够正常工作。文中给出的具体链接和命令行脚本,有助于降低初次接触者的上手难度,提升部署效率和成功率。此外,还强调了一些重要的配置注意事项,例如正确输入API key以及对Ollama的初始化检查等。
,FOC 无感 混合磁链观测器 电机控制 代码 PMSM MiniDD(直驱)电机变频无感程序,包含偏心,重量,共振等感知算法,所有算法都不基于库函数,MCU底层配置完全手写
nodejs010-nodejs-cmd-shim-1.1.0-4.1.el6.centos.alt.noarch.rpm
基于S7-200 PLC的交通灯倒计时控制及组态王界面实现原理图解析,S7-200 PLC和组态王交通灯带倒计时控制 923 47 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,S7-200 PLC; 交通灯; 倒计时控制; 组态王; 梯形图接线图; IO分配; 组态画面,"S7-200 PLC与组态王交通灯倒计时控制:梯形图原理及IO分配详解"
西门子四轴卧加后处理系统:828D至840D兼容,四轴联动高效加工解决方案,支持图档处理及试看程序。,西门子四轴卧加后处理,支持828D~840D系统,支持四轴联动,可制制,看清楚联系,可提供图档处理试看程序 ,核心关键词:西门子四轴卧加后处理; 828D~840D系统支持; 四轴联动; 制程; 联系; 图档处理试看程序。,西门子四轴卧加后处理程序,支持多种系统与四轴联动
FPGA篮球赛事24秒倒计时计时器设计与实现(基于Verilog与VHDLL的优化对比),基于fpga篮球倒计时24s。 verilog和vhdl两个版本 ,基于FPGA篮球倒计时24s; Verilog版本; VHDL版本,FPGA篮球比赛倒计时24秒系统:Verilog与VHDL双版本实现
论生成式AI在大学生学习中的应用与伦理问题.pdf
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
"S7-200plc与MCGS智能居家控制系统的深度融合:组态画面、IO分配与梯形图接线图原理详解",No.63 S7-200plc和 MCGS智能居家控制系统组态 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,核心关键词:S7-200plc; MCGS智能居家控制系统; 梯形图接线图原理图; io分配; 组态画面。,"S7-200 PLC与MCGS智能居家系统组态及梯形图原理图解析"
方便暖通工程师及板换用户了解艾齐尔板式换热器选型计算,免费使用。
《四层三列堆垛式立体库控制系统:带解释的梯形图接线原理图及IO分配与组态画面详解》,4x3堆垛式立体库4层3列四层三列书架式立体库控制系统 带解释的梯形图接线图原理图图纸,io分配,组态画面 ,立体库; 堆垛式; 控制系统; 梯形图; 接线图; 原理图; IO分配; 组态画面,"立体库控制系统原理图:四层三列堆垛式书架的IO分配与组态画面"
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx
免费JAVA毕业设计 2024成品源码+论文+数据库+启动教程 启动教程:https://www.bilibili.com/video/BV1SzbFe7EGZ 项目讲解视频:https://www.bilibili.com/video/BV1Tb421n72S 二次开发教程:https://www.bilibili.com/video/BV18i421i7Dx