深入分析java中webwork中的文件上传机制-Java基础-Java-编程开发

Java实现调用外部程序 1.添加依赖,将Apache Commons Exec库添加到项目中复制代码2.构造命令行对象:通过 CommandLine 对象构造需要执行的外部程序和参数。复制代码3.创建执行器对象:通过 DefaultExecutor 对象创建一个执行器,并设置工作目录(可选)。复制代码4.创建处理器对象:PumpStreamHandler 对象可以处理输入输出流并存储进程的标准输出和标准错误信息。复制代码5.执行命令并等待进程结束:调用 executor.execute方法执行命令。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>点击上传按钮后,webwork的程序流如下:

step 1)进入ServletDispatcher.service
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException {
........

request = wrapRequest(request);
.........
}

step2)进入ServletDispatcher.wrapRequest
protected HttpServletRequest wrapRequest(HttpServletRequest request) throws IOException {
........................

if (MultiPartRequest.isMultiPart(request)) {
request = new MultiPartRequestWrapper(request, getSaveDir(), getMaxSize());
}

return request;
}

step3)进入MultiPartRequestWrapper的构造方法
public MultiPartRequestWrapper(HttpServletRequest request, String saveDir, int maxSize) throws IOException {
.....................
//step3.1)获取webwork.preperties配置的parser
String parser = "";

parser = Configuration.getString("webwork.multipart.parser");

// If it's not set, use Pell
if (parser.equals("")) {
log.warn("Property webwork.multipart.parser not set."
" Using com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest");
parser = "com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest";
}
// legacy support for old style property values
else if (parser.equals("pell")) {
parser = "com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest";
} else if (parser.equals("cos")) {
parser = "com.opensymphony.webwork.dispatcher.multipart.CosMultiPartRequest";
} else if (parser.equals("jakarta")) {
parser = "com.opensymphony.webwork.dispatcher.multipart.JakartaMultiPartRequest";
}

//step3.2)获取后通过反射实例化parser
try {
Class baseClazz = com.opensymphony.webwork.dispatcher.multipart.MultiPartRequest.class;

Class clazz = Class.forName(parser);

// make sure it extends MultiPartRequest
if (!baseClazz.isAssignableFrom(clazz)) {
addError("Class '" parser "' does not extend MultiPartRequest");

return;
}

// get the constructor
Constructor ctor = clazz.getDeclaredConstructor(new Class[]{
Class.forName("javax.servlet.http.HttpServletRequest"),
java.lang.String.class, int.class
});

// build the parameter list
Object[] parms = new Object[]{
request, saveDir, new Integer(maxSize)
};

// instantiate it
multi = (MultiPartRequest) ctor.newInstance(parms);
.................................................
}

//step4 进入JakartaMultiPartRequest的构造方法(我在webwork配置的parser是Jakarta所以进入了这个方法,如果你配置不同的parser回进入不同的parser
public JakartaMultiPartRequest(HttpServletRequest servletRequest, String saveDir, int maxSize)
throws IOException {

//设置保存参数
DiskFileUpload upload = new DiskFileUpload();
// we must store all uploads on disk because the ww multipart API is missing streaming
// capabilities
upload.setSizeThreshold(0);
upload.setSizeMax(maxSize);
if (saveDir != null) {
upload.setRepositoryPath(saveDir);
}

// Parse the request
try {

//此方法生成文件,将请求中的每个参数都生成一个临时文件比如upload_00000017.tmp, upload_00000018.tmp等,就算是form提交的参数也如此
List items = upload.parseRequest(servletRequest);

......................
}

执行完第四步,然后推出ServletDispatcher.wrapRequest,进入serviceAction方法,开始action及其拦截器的栈调用

在此过程中会删除非上传文件的临时文件,至于哪一步删除,我还没看出来,有时候很早有时候很晚,有时候甚至没有删除,我怀疑有个dameon在做这个事。

进入action和调用栈后,拦截器或action可通过如下代码访问上传的临时文件
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) req;
File doc = wrapper.getFiles("doc")[0];

从上面的分析可以看出:
1)如果你使用webwork来上传文件(在进入action栈之前不修改源码或者做一些扩展、覆盖之类的动作),在进入action栈的时候文件已经上 传,而且其文件名很难跟踪(upload_00000017.tmp,到底是00000017,0000018,或者0000022等等),毕竟有很多人 上传文件,所以临时文件名很难确定,所以如果你想知道上传的进度很难。
2)利用webwork上传文件是两次拷贝过程,webwork首先从request的输入流中将文件流输出到一个临时文件,然后你再将此临时文件拷贝到你需要指定的路径。这是好是坏?

java调用外部文件 有关java怎样调用外部文件的,可以是exe,也可以是chm等 立即下载

相关推荐

医学图像中的小目标病灶检测难题:我的硕士研究总结与思考

医学图像中的小目标检测和分割,主要指在CT、MRI、超声等医学影像中识别和分割微小病灶或细小结构。这些小目标通常体积小、边界模糊、特征不明显,却往往是关键病灶,例如肺部小结节、脑微出血、乳腺微钙化等。

weixin_45638136的博客 2370

如何在Java程序中运行外部类文件

点击上传按钮后,webwork的程序流如下:step 1)进入ServletDispatcher.servicepublic void service(HttpServletRequest request, HttpServletResponse response) throws ServletException {........request = wrapRequest(request);..

溺水的鱼 - Later equals never. 1201

AWSIM模拟器 新增多相机

本文介绍了基于Unity6引擎对AWSIM自动驾驶模拟器的优化方案,主要针对多相机系统的扩展实现。作者通过修改EgoVehicle.cs和AutowareSimulationDemo.cs核心代码,将原单相机系统升级为5相机配置。关键技术点包括:1)使用List容器管理多个CameraSensor组件;2)完善相机初始化流程;3)配置5个相机UI显示窗口;4)修改ROS话题设置。优化后的系统可支持BEVFusion等多传感器融合算法的测试验证,为Autoware.universe 0.45.0及以上版本提供

W805698955的博客 832

重写request,使其可以读取文件

Servlet里面的request只能读取字符串,现在重写,使其也可以读取文件 public class MyHttpServletRequest extends HttpServletRequestWrapper { //先创建一个新的集合,这个集合我们要在其中添加普通表单字段和文件类型的表单字段 private Map allParams = null; public MyHttp...

越努力越幸运 942

LangChain Agent Skills 实战指南:12个案例玩转智能体技能封装与编排

大语言模型应用开发中,智能体(Agent)的能力扩展正从零散的函数调用走向标准化封装。Agent Skills 将某项具体能力组织为带说明、代码与依赖的技能目录,让模型能自动发现和调度,其核心价值在于解决工具数量膨胀后的维护混乱与调用失控问题。与 Tool 的单一执行、MCP 的协议连接不同,Skill 更强调能力的语义描述与组合复用,配合 LangGraph 的状态编排和 LangSmith 的可观测性,可构建生产级智能体系统。在实际场景中,Agent Skills 可覆盖 RAG 知识库问答、多轮记忆保

weixin_34335458的博客 408

从编译到调通:RK3588与FPGA的PCIe XDMA驱动实战解析

本文详细解析了在RK3588平台上为FPGA板卡编译、加载与调试PCIe XDMA驱动的完整实战流程。内容涵盖环境准备、Makefile深度定制、编译排错、驱动加载与内核日志解读、设备节点分析以及用户空间编程实战,旨在帮助开发者打通RK3588与FPGA之间的高速PCIe通信链路,实现稳定可靠的数据传输。

weixin_29304021的博客 484

Java如何调用其他类或者外部类

文件夹 little.java HelloWorld.java //little.java package j2se; public class little { public static void main(String[]args){ Fulei.main(args); HelloWorld.main(args); } } class Fulei{ public static void main(String[] args){ int b = 1; System.o

范天缘的博客 5929

.NET适配HarmonyOS进展 1. 前言

目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Conf CN上分享过,目前又取得一点进展,所以本文把所有问题进行整合与大家进行分享。

2301_76476890的博客 1462

Java调用外部可执行程序或系统命令

Java调用外部可执行程序或系统命令

m0_46487331的博客 7928

一篇文章带你认识 SpringBoot

文章目录一、原有 Spring 优缺点分析二、SpringBoot 的概述 一、原有 Spring 优缺点分析 (1)Spring 的优点分析 Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的 Java 对象(Plain Old Java Object,POJO)实现了EJB的功能。

南淮北安的博客 766

Python 爬虫实战:网站反爬机制绕过终极指南(技术原理 + 实战代码 + 避坑技巧)

在 Python 爬虫的世界里,反爬机制是每一个爬虫开发者都必须面对的挑战。网站为了保护自身数据不被恶意爬取,会设置各种反爬机制,这使得爬虫开发变得更加复杂和有趣。本文将详细介绍常见的网站反爬机制及其绕过方法,结合技术原理、实战代码和避坑技巧,帮助你成为一名优秀的爬虫开发者。

u014481728的博客 1006

深入分析java中webwork中的文件上传机制

深入分析java中webwork中的文件上传机制   点击上传按钮后,webwork的程序流如下:  step 1)进入ServletDispatcher.service public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException { ........  

溺水的鱼 - Later equals never. 976

lammps教程:非晶sio2建模方法

大家好,我是小马老师。 本文介绍非晶sio2的建模方法。 sio2的建模方法有很多,可以下载cif文件使用atomsk转为data文件,也可以直接在ms中导入sio2结构,这些方法建的sio2都是标准的sio2晶体。 如果要建立非晶状态的sio2,就是把排列规则的sio2变成无序排列的sio2。 非晶建模方法有很多,在lammps中,可以通过高温高压的方法打乱sio2的排列实现非晶建模。 代码中的温度和步数可根据需要自己调整。 下面给出in文件案例代码。 units metal atom

lammps_jiayou的博客 5271

java文件上传中间件_深入分析Java中webwork的文件上传机制

点击上传按钮后,webwork的程序流如下:step 1)进入ServletDispatcher.servicepublic void service(HttpServletRequest request, HttpServletResponse response)throws ServletException {........request = wrapRequest(request);......

weixin_39797393的博客 213

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深入分析webwork中的文件上传机制

点击上传按钮后,webwork的程序流如下: step 1)进入ServletDispatcher.service public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException { ........request = wrapRequest(request...

系统运维 115

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

WebWork完成用户注册的例子

功能描述:一个用户注册页面register.jsp,用户可以在这个页面里输入用户注册的基本信息(例如:姓名、密码、Email等),输入完成提交表单,执行用户注册的Action,执行成功返回成功提示的页面(register-result.jsp)并将注册的信息输出。模型:User.java 控制:RegisterAction.java视图:register.jsp、register-result.j

scu2scut的专栏 1148

efm32 入门.pdf

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

Struts2的工作机制及分析

(原文)http://www.blogjava.net/lzhidj/archive/2008/07/10/213898.html Struts2教程--第二章 Struts2的工作机制及分析 第二章 Struts2的工作机制及分析 概述 本章讲述Struts2的工作原理。 读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一...

137

Spring MVC framework深入分析

在当今的MVC framework里,似乎Webwork2逐渐成为主流, Webwork2+SpringFramework的组合变得越来越流行。这似乎意味着Spring自带的MVC framework远比Webwork2差,所以大家纷纷用Webwork2来代替。确实,Spring的MVC framework不算是整个Spring的核心部件,但它的威力却超过了很多人的想象。很多人包括xiecc认为...

通向理想,你我同行 128

刚在 Apache 网站上把 VelocityWeb 放到了 Spring 和 WebWork 之间。

刚在 Apache 网站上把 VelocityWeb 放到了 Spring 和 WebWork 之间。网页 http://wiki.apache.org/velocity/PoweredByVelocity最开始我把 VelocityWeb 放到最下面,因为这个开源框架开发出来不久。后来发现,这里面的项目都是按照字母顺序放的,所以很不客气地把 VelocityWeb  放到 WebWork 前面去

jacklondon的专栏 1325

第二章 Struts2的工作机制及分析

读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。实际上Struts1.x与Struts2并无我们想象的血缘关系。虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。 Struts2是Struts社区和WebWork社区的共同成果,我们甚至可

rgq562248600的专栏 614

Struts2的工作机制及分析(转)

概述  本章讲述Struts2的工作原理。  读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。实际上Struts1.x与Struts2并无我们想象的血缘关系。虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。  Struts2是Struts...

zhouyuan19891124的专栏 152
上一篇: java中删除数据库中重复数据的几个方法-Java基础-Java-编程开发
下一篇: 用AJAX J2EE实现一个网上会议室系统-Java基础-Java-编程开发
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值