文件的上传(1)
来源:互联网 发布:除了暴风影音知乎 编辑:程序博客网 时间:2024/06/07 04:58
11,11,23
文件的上传
一、文件上传概述
1、 实现web开发中的文件上传功能,需完成如下两步操作:
(1) 在web页面中添加上传输入项(JSP页面或html页面)。
(2) 在servlet中读取上传文件的数据,并保存到本地硬盘中。
2、 如何在web页面中添加上传输入项?
(1)<input type=”file”>标签用于在web页面中添加文件上传输入项,设置文件上传输入项时须注意:
1)必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。
2)必须把form的enctype属值设为multipart/form-data.设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。
3、 如何在Servlet中读取文件上传数据,并保存到本地硬盘中?
1) Request对象提供了一个getInputStream方法,通过这个方法可以读取到客户端提交过来的数据。但由于用户可能会同时上传多个文件,在servlet端编程直接读取上传数据,并分别解析出相应的文件数据是一项非常麻烦的工作,示例。
2) 为方便用户处理文件上传数据,Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),该组件性能优异,并且其API使用极其简单,可以让开发人员轻松实现web文件上传功能,因此在web开发中实现文件上传功能,通常使用Commons-fileupload组件实现。
4、 使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。commons-io 不属于文件上传组件的开发jar文件,但Commons-fileupload 组件从1.1 版本开始,它工作时需要commons-io包的支持。
二、文件上传实例:
文件上传页面。JSP页面:代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>文件上传页面</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<form action="${pageContext.request.contextPath}/servlet/UploadServlet" method="post" enctype="multipart/form-data">
上传用户:<input type="text" name="user"><br>
上传文件:<input type="file" name="file1"/><br/>
上传文件:<input type="file" name="file2"/><br/>
<input type="submit" value="上传文件"/>
</form>
<form action="${pageContext.request.contextPath}/servlet/UploadServlet2" method="post" enctype="multipart/form-data">
上传用户:<input type="text" name="user"><br>
上传文件:<input type="file" name="file1"/><br/>
上传文件:<input type="file" name="file2"/><br/>
<input type="submit" value="上传文件"/>
</form>
</body>
</html>
在com.hbsi.servlet包下,创建servlet类。实现文件上传。
package com.hbsi.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 文件的上传
try {
// (1)创建一个工厂对象-----FileItem对象
DiskFileItemFactory factory = new DiskFileItemFactory();
// (2)得到解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//解决上传文件的乱码问题
upload.setHeaderEncoding("utf-8");
// (3)对请求进行解析,有几个输入项,就有几个FileItem对象
List<FileItem> list = upload.parseRequest(request);
//对list集合中的元素进行讨论,增强的for循环
//(4)迭代list集合,获取list集合中每一个输入项
for(FileItem item:list){
//(1)判断输入项的类型
if(item.isFormField()){
//普通输入项
String inputName=item.getFieldName();
//解决输入的中文乱码问题
String inputValue=item.getString("utf-8");
System.out.println(inputName+" "+inputValue);
}else{
//上传文件的输入项
String filename=item.getName();//上传文件的文件名
filename=filename.substring(filename.lastIndexOf("\\")+1);//为了得到上传文件的文件名
InputStream is=item.getInputStream();
FileOutputStream fos=new FileOutputStream("e:\\"+filename);
//从输入流中读取数据
byte[] buff=new byte[1024];
int len=0;
while((len=is.read(buff))>0){
fos.write(buff,0,len);
}
is.close();
fos.close();
}
DiskFileItemFactory factory1 = new DiskFileItemFactory();
factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));
FileItem item1;
item.delete();
}
request.setAttribute("message","上传成功!");
} catch (FileUploadException e) {
e.printStackTrace();
request.setAttribute("message","上传失败!");
}
request.getRequestDispatcher("/message.jsp").forward(request,response);
}
}
- 文件的上传(1)
- 文件的上传(一)
- servlet文件上传(1)---》form表单的enctype属性以及上传文件请求内容
- struts2的文件上传(1):每次上传多个文件
- 文件上传案例(1)
- 文件的上传(表单上传和ajax文件异步上传)
- 文件的上传(表单上传和ajax文件异步上传)
- 文件上传简介1---上传到指定的目录1
- 文件上传简介1---上传到指定的目录2
- 文件上传简介1---上传到指定的目录3
- 文件上传简介1---上传到指定的目录
- C#实现Web文件的上传-1
- 上传大于1G的文件
- servlet+uploadify3.1实现文件的上传
- 文件上传容量的设置1
- Extjs 文件的上传(基于struts2)
- PHP文件上传的实现(一)
- 文件的上传和下载(一)
- 类的成员变量初始化
- XML中常用转义字符
- 集合工具类
- VC学习三:静态文本框
- 牛刀:房价下降50%可保未来中国10年盛世
- 文件的上传(1)
- LTE PUCCH 1 资源计算
- 有趣的杀人游戏(没有用循环链表)
- TTTAttributedLabel 中的一些bug
- 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)
- Linux 十个常用命令
- 算法导论5.4-2
- 如果能有“如果”
- 云计算时代:大数据泡沫正无限膨胀