struts2上传word文件并保存到服务器上

vue使用ntko控件完成word上传、html上传 前言 新项目前端用的是vue框架,后端用的是struts1框架(没错,就是struts1)。客户要求增加word上传的功能,这个功能在以前老项目里面已经存在,只需将jsp改造成vue。实际上,在改造过程中遇到了很多问题,记录下。 步骤 ntko需要传递一些参数,我把它们写在props上,父组件使用时只需传递这些参数就可以了。 props: { settings: { ... 阅读详情

1.前台js:

Ext.onReady(function() {
	      Ext.QuickTips.init();
          Ext.form.Field.prototype.msgTarget = 'side';
var file = new Ext.form.TextField({
		fieldLabel : '其他要求',
		name : 'file',
		allowBlank : true,
		msgTarget : 'under',
		validator : function(value) {
			if (value != "") {
				var arr = value.split('.');
				// doc,docx两种格式均可 
				if (arr[arr.length - 1] != 'doc'
						&& arr[arr.length - 1] != 'docx') {
					return '文件不合法,请上传word文件';
				} else {
					return true;
				}
			}else{
				return true;
			}
		},
		inputType : 'file'// 文件类型
	});
var sure1 = new Ext.Button({
				text : '确定',
				handler : function() {
					// 这里的作用是将radiogroup的值获取并传到隐藏域
					if (form.getForm().isValid()) {

						form.getForm().findField('activity.activityType')
								.setValue(hdlx.getValue().inputValue);
						// alert(form.getForm().findField('activity.activityType').getValue());
						form.getForm().submit({
									// waitTitle : '请稍后',
									// waitMsg : '正在上传文档文件 ...',
									success : function(form, response) {
										Ext.getCmp('form').form.reset();
										// 添加活动成功后,清除已填入的数据,防止多次提交
										Ext.get("msg").dom.innerHTML = "成功";

									},
									failure : function() {
										Ext.get("msg").dom.innerHTML = "失败,请与管理员联系";
									}
								});
					}
				}
			});
	var reset1 = new Ext.Button({
				text : '重置',
				handler : function() {
					form.getForm().reset();
				}

			});
	var form = new Ext.form.FormPanel({
				renderTo : 'mainform',
				frame : true,
				id : 'form',
				name : 'form',
				url : '../sys_act/adminAction_act_addActivity',//
				// fileUploadServlet
				width : '100%',
				html : '<div id="msg" class="tipmsg"></div>',
				height : '100%',
				fileUpload : true,
				// radioGroup不能直接将值传给action所以我在这里添加了一个隐藏域来传值
				items : [huodongname, duixiang, time1, time2, zysx, rsxz, hdlx,file,
						{
							xtype : 'hidden',
							id : 'activity.activityType',
							name : 'activity.activityType'
						}],
				buttons : [sure1, reset1]
			});
	var win = new Ext.Window({
				title : '添加活动',
				resizable : true,
				width : '80%',
				y: 2, //窗口的初始化Y坐标强制为2,以防窗口太大被标题遮盖
				shadow : true,
				modal : false,
				maximizable : true,
				closable : true,
				items : form
			});
	win.show();

});



2.struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>

	<constant name="struts.devMode" value="true"></constant>
<span style="white-space:pre">	</span><package name="admin_act" namespace="/sys_act" extends="json-default">
		<action name="adminAction_act_*" class="adminAction_act"
			method="{1}">
			<result type="json"></result>
		</action>
	</package>
</struts> 


3.action

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.annotation.Resource;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.alibaba.fastjson.JSON;

@Controller("adminAction_act")
@Scope("prototype")
public class AdminAction extends BaseAction {
	private AdminService adminService;
	private String activityName;
	private Activity activity;
	private String testStr;
	private String JSONActivities;
	private String activityID;

	// 上传文件的参数
	private File file; // 具体上传文件的 引用 , 指向临时目录中的临时文件
	private String fileFileName; // 上传文件的名字 ,FileName 固定的写法
	private String fileContentType; // 上传文件的类型, ContentType 固定的写法
	private static Logger logger = Logger.getLogger(AdminAction.class);


	public String addActivity() {
		logger.debug("!!!这里是客户端刚提交的activity信息!*******" + activity.toString());
		if (fileFileName == null) {
			try {
				// activity.setTemplate("");
				adminService.addActivity(activity);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				sendMsg2Client(Constants.JSON_FAILURE);
			}
		} else {
			try {
				// 获取文件存储路径
				String path = ServletActionContext.getRequest().getRealPath(
						"/sys_act/template");
				// 定义时间戳
				Date now = Calendar.getInstance().getTime();
				SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmm");
				// 对上传文件进行重命名,规则为act_tpl_+时间戳(当前时间的整型值)
				String fileFileName2 = "act_tpl_" + sdf.format(now) + ".doc";
				// 输出流
				File file2 = new File(path, fileFileName2);

				if (!file2.getParentFile().exists()) {
					file2.mkdirs();
				}

				OutputStream os = new FileOutputStream(file2);
				// 输入流
				InputStream is = new FileInputStream(file);

				byte[] buf = new byte[1024];
				int length = 0;

				while (-1 != (length = is.read(buf))) {
					os.write(buf, 0, length);
				}
				is.close();
				os.close();

				activity.setTemplate(fileFileName2);
				adminService.addActivity(activity);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				sendMsg2Client(Constants.JSON_FAILURE);
			}
		}

		sendMsg2Client(Constants.JSON_SUCCESS);

		return null;
	}
}






护网实战攻防解析:从SQL注入到横向移动的完整攻击链 网络安全的核心在于理解攻击与防御的对抗本质。从基础概念看,攻击通常遵循网络杀伤链模型,涵盖侦查、武器化、投递、利用、安装、命令控制和目标行动等阶段。其技术价值在于揭示了体系化攻击的完整生命周期,为构建有效防御提供了框架。在应用场景上,无论是护网演练还是日常安全运维,掌握常见攻击方式的原理与组合都至关重要。例如,SQL注入漏洞源于将未经验证的用户输入直接拼接至数据库查询语句,而文件上传漏洞则因对文件类型、内容校验不足,导致恶意Webshell被上传执行。这些漏洞常被组合利用,形成从外网突破到内网横向移动的完整 阅读详情

相关推荐

模板驱动型文档自动化:企业级文档生产的声明式范式

文档自动化是现代企业内容生产的核心基础设施,其本质是将重复性排版规则、结构逻辑与合规要求转化为可复用、可验证的机器指令。区别于脚本驱动的命令式实现和AI生成的概率性输出,模板驱动采用声明式范式——聚焦‘最终状态’而非‘执行过程’,通过模板分层(基础/业务/客户)、动态内容绑定与样式继承机制,在零代码前提下保障跨格式一致性与强合规性。该技术显著降低非技术人员操作门槛,支撑PDF/A-2b、EPUB3、HTML5等多格式专业输出,广泛应用于SaaS报价单、合规报告、品牌手册等高频文档场景,成为知识资产沉淀与组织

Bob1228的专栏 455

struts2实现word文件上传和在线阅读

1. 新建工程后,先引入struts2的jar包:右击项目---myeclipse---add struts capabilities,引入后,web.xml中会生成对应的filter: [html] view plaincopyprint? filter>      filter-name>struts2filter-name>      filter-class>

你等着...我会踩着五彩祥云来接你的! 2421

从零构建WebOA系统:Spring Boot+Vue3全栈实战与架构设计

办公自动化(OA)系统是企业信息化建设的核心,旨在通过技术手段优化审批、协同与文档管理等业务流程,提升组织效率。其技术原理通常基于B/S架构,实现浏览器端的便捷访问与服务器端的集中处理。在技术价值层面,自研OA系统能深度契合企业个性化流程,实现数据自主可控与灵活扩展,避免了商业化产品常见的定制成本高与流程僵化问题。典型的应用场景包括请假报销审批、公文流转、任务管理与知识共享等内部协同办公。本文聚焦于使用Spring Boot和Vue3等技术栈,深入剖析如何设计并实现一个轻量级、可定制的WebOA系统,涵盖权

weixin_33829657的博客 385

Struts2实现文件上传

一、文件上传原理表单元素的enctype属性执行的是表单元素的编码方式,该属性有三个值;1)、application/x-www-form-urlencoded:这是默认的编码方式,它只处理表单中的value,采用这种方式的表单会将表单域里的值处理成url编码方式。2)、multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也

Speed_Pig的博客 517

ssh2+ajx导出导入word

ssh2+ajx导入导出word源码实例

struts2 上传文件及打包下载zip

一个简单的struts2的上传下载demo,希望对大家有帮助

如何实现word上传服务器

八月的天空,弥漫着思念的气息,你如那紫色的精灵,把我褶皱的情怀舒展。原来你就在这里,我拥住了今生的情缘,把八月的天空涂抹得一片湛蓝。 走进八月,你会看到八月的色彩如同阳光照耀着生命的幸福,在田野上滚动,拂动着嫩绿的禾苗,在天地间升腾,映照着洁白的云朵,叠映在忙碌的身影里,抚摩着耕耘的喜悦。 最近小编有点忙,围着项目玩耍呢:刚进一个系统,还不是非常了解业务,项目组长分配了

时光刻下的容颜 2202

SSH文件上传保存到MySql数据库

JAVA SSH 文件上传,并保存到 Mysql数据库,通过struts标签获取上传文件信息。 简单易用 项目包括相应的JAR包。还有一些常用到的JAR包。

struts2 word、excel文件的上传。用到RandomAccessFile 类读取文件。

java se基础部分。( 获取文件的名称,记录下来以后用到的时候再用。。。。) ============================================================================================== public class A { static HashMap fileList=new HashMap(); pu

shanna0806的专栏 1105

Linux 系统管理员必备:Chrome 企业版离线部署全攻略(含 RPM/DEB 双版本)

本文详细介绍了Linux系统管理员如何离线部署Chrome企业版,涵盖RPM和DEB双版本。从获取官方离线安装包到静默安装、权限配置及企业级策略管理,提供全流程解决方案,特别适合Ubuntu等DEB系系统管理员参考。

f9g0h的博客 485

FPGA:UART串口接收(高干扰情况)

在上一篇文章中介绍过UART串口接收模块,其中一个需要优化的方向就是在高干扰情况下,如何实现可靠的UART串口接收任务。

weixin_50164178的博客 1672

struts上传word和excel文件到oracle,Struts文件上传,下载,重传,预览

【Struts2】☆★之文件上传,下载,重传,预览今日群里一兄弟问我能否给一份struts文件上传下载的例子,因为自己项目比较紧所以想在网上找些源码给他,但是纵观全网,写的都不是太全,这让新手使用都不是太方便,利用周天花了30分钟写了一个。发布出来,发布出来大家共同学习!其中包括数据库的设计,路径存储,重现上传删除服务器源文件,图片预览,等!知识你我共同分享!首先明白文件上传下载的原理。①、利用输...

weixin_30239869的博客 220

開機自動進入UEFI Interactive Shell無法正常開機怎麼辦?

BIOS/UEFI,啟動後進入UEFI Interactive Shell大多數人都告訴你沒有安裝系統去裝系統吧,但你明明昨天還在運行系統?今天就這樣?有沒有解決辦法?

sheaahhoi1的博客 7742

文件上传与下载的功能实现

1、文件上传 1.1、文件上传原理 1.2、文件上传核心api 1.3、文件上传代码实现 2、文件下载案例实现

宏微的博客 1万+

OpenCL编译环境配置

在 Linux 系统上配置 OpenCL 开发环境需要安装适当的驱动、运行时和开发工具。

深之JohnChen的专栏 2003

点击率预测的贝叶斯平滑

概述 电商领域中经常需要计算或预测一些转化率指标,如最典型的CTR(点击率,Click-Through Rate)。这些转化率可以是模型的预测值,也可以作为模型的特征(feature)使用。以商品点击率预测为例,CTR的值等于点击量(Click)除以曝光量(Impression或Exposure)。以rr表示点击率, r=CI(1)r=\frac{C}{I} \tag{1}. 但在实际应

小平子的专栏 3万+

Mkyong 中文博客翻译(七十)

原文:Mkyong 协议:CC BY-NC-SA 4.0 Struts 错误–NoSuchMethodError:digester . parse(Ljava/net/URL;)Ljava/lang/Object 原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts/struts-error-nosuchmethoderror-digester-parseljavaneturlljavalangobject/

龙哥盟 1014

【异常】Claude Code CLI 模型调用异常 There‘s an issue with the selected model (claude-sonnet-4-6). It may not

摘要: Claude Code CLI v2.1.45版本存在适配缺陷,导致调用claude-sonnet-4-6模型时触发"模型不存在"的误报错误(跨Windows/Linux平台)。该问题为版本回归类异常,非模型或账户权限问题。解决方案包括:1) 校验模型名称格式为claude-sonnet-4-6;2) 降级至v2.1.34或等待官方修复;3) 检查API配置有效性;4) 通过CLI交互界面手动选择模型;5) 临时切换同系列可用模型。官方已确认该bug并将发布修复版本。

奶爸的编程之路,也就一周冷个三天 6382

服务端口安全攻防:从Hydra爆破到CVE漏洞复现实战指南

在网络安全领域,端口与协议是网络通信的基础入口,也是攻击者首要探查的目标。理解端口扫描、协议分析等基本原理,是掌握服务安全评估的关键。其技术价值在于,通过识别开放服务与协议版本,能够系统性发现未授权访问、弱口令等核心风险点,从而实施有效的安全加固。这些技术广泛应用于渗透测试、红蓝对抗及日常安全运维等场景。本文将聚焦于服务攻防实战,深入解析如何利用Hydra等工具进行弱口令枚举,并结合具体CVE漏洞复现,如Nacos namespaces未授权访问漏洞,演示从漏洞原理到利用验证的完整闭环,为构建服务端口安全防

cixu3288的博客 298

医疗AI多智能体资源调度:用Python构建高性能MCU资源池

本文介绍了医疗AI服务平台中多智能体资源争用问题的解决方案。作者设计了一个基于MCU(多点控制单元)理念的中央资源调度器,通过三层架构(资源抽象层、调度策略层、执行控制层)实现对GPU、API、数据库等医疗资源的统一管理。系统采用增强版信号量机制处理可计数并发资源,优化令牌桶算法管理速率资源,并支持急诊优先、配额限制、审计合规等医疗场景特殊需求。核心代码提供了带优先级抢占的并发控制和医疗专用令牌桶实现,可有效解决多智能体资源争用导致的优先级混乱、资源利用不均等问题。

AllenLV的博客 3218

【原创】汇川H5U PLC控制伺服的方法

6、在线调试-进入伺服调试,可以在本软件上进行调试,可以实现原点回归、正向点动、反向电动、使能(这里使能打开时触摸屏上的使能不能打开,会冲突)、复位、停止(如下图所示)。5、在原点返回设置中一般情况下对原点信号、正限位、负限位、原点返回方向、原点返回方式进行设置,其他设置默认不改(如下图所示)。3、在单位换算设置上只需要修改脉冲数和移动量(根据伺服配套导轨上名牌进行设置),其他设置默认不改(如下图所示)。11、双击后右边出现编辑框 在上半部分定义变量(IN、INOUT、OUT、VAR)(如下图所示)。

Qinmingyue13的博客 6665

Web安全实战:任意文件读取漏洞原理、复现与Java代码修复

在Web应用开发中,文件操作是常见功能,但若对用户输入处理不当,极易引发路径遍历攻击,导致任意文件读取漏洞。其核心原理在于攻击者通过操控请求参数(如文件名、模板路径),利用目录遍历序列(如../)突破程序设定的访问边界,直接读取服务器上的敏感文件。这种漏洞技术价值在于,它虽不直接执行命令,却能为攻击者打开信息泄露的大门,危害等级常被评估为中高危。典型的应用场景包括报表导出、文件下载、日志查看等模块,参数如fileName、templatePath若未经验证,便可能成为攻击入口。本文以一次典型的漏洞复现之旅为

weixin_30423977的博客 390

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

开发者实践指南:如何快速上手并集成Kimi K3大模型API

大语言模型(LLM)通过API接口为开发者提供了强大的自然语言处理能力,其核心原理是基于海量数据训练的Transformer架构,能够理解和生成类人文本。这一技术价值在于显著降低了AI应用开发门槛,使开发者无需从零训练模型即可快速构建智能应用。在应用场景上,LLM广泛用于智能对话、代码生成、文档摘要和复杂推理等任务。对于近期备受关注的Kimi K3模型,其突出的长上下文处理与强推理能力,使其在长文档分析、技术代码审查等场景中表现优异。本文将从API调用、环境配置、成本控制等工程实践角度,提供一份清晰的动手实

weixin_34067102的博客 457

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Sqribble:模板驱动的文档操作系统原理与实战

文档自动化正从‘样式美化’迈向‘结构化交付’,其核心在于将内容与排版解耦,通过可执行的模板规则实现语义级归一化处理。这类工具依托云原生架构,以分页引擎、目录生成算法和图像容错机制为技术支点,解决知识工作者在PDF生成、多端一致性及协作反馈中的高频痛点。相比传统编辑器,它强调‘规则即宪法’——用约束保障专业性,以自动化释放生产力。尤其适合运营、培训、咨询等需批量产出结构化交付物的场景,让内容创作真正聚焦于信息本身而非格式纠缠。

weixin_34127717的博客 574

android 蓝牙通讯demo

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

从Coze到本地部署:智能体开发实战与模型微调指南

智能体(Agent)作为AI应用的核心架构,通过意图理解、工具调用、记忆管理等模块协同工作,实现自动化任务处理。其技术原理基于工作流引擎和检索增强生成(RAG)等机制,将复杂逻辑封装为可编排的节点。在工程实践中,本地部署成为关键需求,它不仅解决数据隐私问题,更提供完整的控制权和长期成本优势。通过开源方案替代闭源平台,结合大模型微调技术,开发者能将通用AI能力深度适配到具体业务场景,构建可靠、可迭代的生产级智能体系统。

weixin_30387799的博客 449
上一篇: web.xml文件的作用
下一篇: Ext.form.TextArea中width,height无效问题
冷静BB
博客等级 码龄12年 298粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值