文件上传

1:完成一个文件上传的功能

index.jsp

注意更换form表单的enctype

enctype就是encodetype就是编码类型的意思。

multipart/form-data是指表单数据有多部分构成,既有文本数据,又有文件等二进制数据的意思。

需要注意的是:默认情况下,enctype的值是application/x-www-form-urlencoded,不能用于文件上传,只有使用了multipart/form-data,才能完整的传递文件数据。

application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。

下面是扩展:

一、关于HTML <form> 标签的 enctype 属性

application/x-www-form-urlencoded:在发送前编码所有字符(默认)

multipart/form-data:    不对字符编码,或在使用包含文件上传控件的表单时,必须使用该值。

text/plain:空格转换为 "+" 加号,但不对特殊字符编码。

二、enctype:规定了form表单在发送到服务器时候编码方式,有如下的三个值

1、application/x-www-form-urlencoded。默认的编码方式。但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得 效率低下。

2、multipart/form-data 。 指定传输数据为二进制类型,比如图片、mp3、文件。

3、text/plain。纯文体的传输。空格转换为 “+” 加号,但不对特殊字符编码。

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="FileServlet" method="POST" enctype="multipart/form-data">
<table>
<tr>
<td>
name:
</td>
<td>
<input name="user">
</td>
</tr>
<tr>
<td>
password:
</td>
<td>
<input name="pwd">
</td>
</tr>
<tr>
<td>
</td>
<td>
<input type="file" name="file">
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="上传">
</td>
</tr>
</table>
</form>
</body>
</html>

FileServlet.java

注意我这里用版本是3.0
@MultipartConfig 这个注解很重要 表示当前serlvet支持文件操作

 package com.web;

 import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part; @WebServlet("/FileServlet")
@MultipartConfig
public class FileServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;utf-8"); //接收参数
//文件描述
String name=request.getParameter("name");
String pwd=request.getParameter("password");
/*String files=request.getParameter("file");
System.out.println("文件描述:"+files);*/
//接收文件 Part part=request.getPart("file");
//文件大小
//input中的name的属性名称
long size=part.getSize();
String inputNmae=part.getName();
System.out.println("文件大小:"+size);
System.out.println("input中的name的属性名称:"+inputNmae); //获得上传的文件名称
//获取报头文件描述
String header=part.getHeader("Content-Disposition"); //返回f字符所在的位置
int idx=header.lastIndexOf("filename:\\");
//filename="xxx.xxxx";xxx.xxx的位置是idx+10~header.length()-1;
String fileName=header.substring(idx+10,header.length()-1);
System.out.println("获得文件上传的名称:"+header);
System.out.println(fileName);
System.out.println("f字符所在的位置:"+idx);
System.out.println("header:"+header.length()); //获得文件内容
InputStream inputStream=part.getInputStream(); //获得文件上传的路径
String path=this.getServletContext().getRealPath("/uploadFile");
System.out.println("获得文件上传的路径:"+path); //取得上传数据的文件名
int fString=fileName.lastIndexOf("\\");
String saveFile=fileName.substring(fString+1); //获取你的文件名 //如果file不存在,在这个路径下创建文件
File file=new File(path);
if (!file.exists()) {
file.mkdirs();
} OutputStream fileWriter=new FileOutputStream(file+"\\"+saveFile);
System.out.println(fileWriter.toString());
byte[] b=new byte[1024];
int len=0;
while((len=inputStream.read(b))!=-1) {
fileWriter.write(b,0,len);
}
fileWriter.close();
}
}

2:完成多个文件上传的功能

index.jsp

前端的写法和上面相差不大

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="FilesServlet" method="POST" enctype="multipart/form-data">
<table>
<tr>
<td>
name:
</td>
<td>
<input name="user">
</td>
</tr>
<tr>
<td>
password:
</td>
<td>
<input name="pwd">
</td>
</tr>
<tr>
<td>
</td>
<td>
<input type="file" name="file">
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="上传">
</td>
</tr>
</table>
</form>
</body>
</html>

index.jsp

FileServlet.java

首先导入两个jar

commons-fileupload-1.3.1.jar(依赖下面那个)

commons-io-1.3.2.jar

 package com.web;

 import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
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; @WebServlet("/FilesServlet")
@MultipartConfig
public class FilesServlet extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8"); //请求的编码
response.setCharacterEncoding("utf-8"); //响应的编码
response.setContentType("text/html;utf-8"); //数据显示时的编码 //得到上传文件的目录,将上传文件保存于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
String realPath= this.getServletContext().getRealPath("/upload");
System.out.println("文件存放的位置:"+realPath);
//设置临时目录,上传文件大于缓冲区则先放于临时目录中
String tempPath="E:\\tempPath";
System.out.println("临时文件的存放位置:"+tempPath); //判断存放上传文件的目录是否存在(不存在创建)
File file=new File(realPath);
if(!file.exists()) {
System.out.println("目录不存在!创建目标目录");
file.mkdir();
} //判断临时目录是否存在(不存在则创建)
File file2=new File(tempPath);
if(!file2.exists()) {
System.out.println("临时文件目录不存在!创建临时文件目录");
file2.mkdir();
} /**
* 使用Apache文件上传组件处理文件上传步骤
*
*/
//1.设置环境:创建一个
DiskFileItemFactory factory=new DiskFileItemFactory(); //设置上传文件的临时目录
factory.setRepository(file2); //2.操作核心类
ServletFileUpload upload=new ServletFileUpload(factory); //解决上传编码的问题
upload.setHeaderEncoding("utf-8"); //3.判断enctype:判断提交上来的数据是否是表单提交上传表单的数据
if(!upload.isMultipartContent(request)) {
System.out.println("不是文件,终止");
//按照传统方式获取数据
return;
} //==获取输入像===
//限制单个上传文件的大小(5M)
upload.setFileSizeMax(1024*1024*4);
//限制总上传文件大小(10M)
upload.setSizeMax(1024*1024*6); //4.使用ServletFileUpload解析器上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
try {
List<FileItem> parseParameter = upload.parseRequest(request);
for (FileItem fileItem : parseParameter) {
//如果fileItem中封装的是普通输入项的数据(输出名,值)
if(fileItem.isFormField()) {
String common=fileItem.getFieldName();
String commonValue=fileItem.getString("utf-8");
System.out.println("普通属性:"+common+": "+commonValue);
}else {
//如果fileItem中封装的是上传文件,得到上传的文件名称
String FileName=fileItem.getName();
//多个文件上传有输入框有空的异常处理
if (FileName==null ||FileName.trim().equals("")) {
continue; //为空则退出那一次循环, 第一个没输入则跳过可以继续输入第二个
} //注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理上传文件的文件名的路径,截取字符串只保留文件名部分。//截取留最后一个"\"之后,+1截取向右移一位("\a.txt"-->"a.txt")
FileName=FileName.substring(FileName.lastIndexOf("\\")+1);
//拼上上传路径。存放路径+上传的文件
String filePath =realPath+"\\"+FileName; //构造输入输出流
InputStream inputStream=fileItem.getInputStream(); //获取fileItem的上传文件的输入流
OutputStream outputStream=new FileOutputStream(filePath); //创建一个文件输入流 //创建一个缓冲区
byte[] b=new byte[1024];
//判断输入流中的数据是否已经读完标识
int len=-1;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))!=-1就表示in里面还有数据
while((len=inputStream.read(b))!=-1) { //没数据则返回-1
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\\"+filename)当中
outputStream.write(b,0,len);
} //关闭流
inputStream.close();
outputStream.close();
//删除临时文件
Thread.sleep(3000);
fileItem.delete(); //删除处理文件上传时生成的临时文件
System.out.println("文件上传成功!!");
} }
} catch (FileUploadException | InterruptedException e) {e.printStackTrace();} } }

需要注意的是:注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:  c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt

jsp 文件上传操作的更多相关文章

  1. jsp文件上传

    整理了一下jsp的上传下载,由客户端到服务端,包括一些常规的业务 一客户端 先看最基本的情况 1 在表单设置multipart/form-data,通过提交键把数据和附件一次性提交的.服务器更多的是对 ...

  2. 不用外部JAR包,自己实现JSP文件上传!

    看书上(JSP应用与开发技术)使用JSP文件上传,写了个真无语,压根就有很多问题,上传500KB的文件传过去后只剩350KB,而且编码必须是GBK.GB2312,否则传过去的文件都数据截取不正确. 琢 ...

  3. JSP 文件上传下载系列之二[Commons fileUpload]

    前言 关于JSP 文件上传的基础和原理在系列一中有介绍到. 这里介绍一个很流行的组件commons fileupload,用来加速文件上传的开发. 官方的介绍是:  让添加强壮,高性能的文件到你的se ...

  4. python-web自动化-文件上传操作(非input标签的上传,需要借助第三方工具)

    文件上传操作 一.文件上传分两种情况:1. 如果是input可以直接输入路径的,可以直接调send_keys输入路径 2. 非input标签的上传,需要借助第三方工具:    2.1 Autolt 需 ...

  5. JSP 文件上传

    JSP 文件上传 JSP可以通过HTML的form表单上传文件到服务器. 文件类型可以是文本文件.二进制文件.图像文件等其他任何文档. 创建文件上传表单 接下来我们使用HTML标签来创建文件上传表单, ...

  6. JSP-Runoob:JSP 文件上传

    ylbtech-JSP-Runoob:JSP 文件上传 1.返回顶部 1. JSP 文件上传 JSP 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器.上传的文件可以是文本文件或图 ...

  7. ui自动化chrome文件上传操作

    web自动化,再chrome浏览器中文件上传操作

  8. JSP文件上传--FileUpload组件

    如果使用上传操作,并且没有使用框架之类,最好使用Smartupload,因为FileUpdate太难使用. 下载组件: fileupload包:http://commons.apache.org/pr ...

  9. JSP文件上传--Smartupload组件

    把smartupload.jar copy到D:\apache-tomcat-7.0.57\lib下. 创建htm上传文件:smartupload_demo01.htm 由于是上传文件,需要对表单进行 ...

随机推荐

  1. BEC listen and translation exercise 40

    However, recently there's been more and more interest in the development of ostrich farming in other ...

  2. Java 对象引用以及对象赋值

    一.Vehicle veh1 = new Vehicle(); 通常这条语句执行的动作被称为创建一个对象,其实他包含了四个动作. 1.new Vehicle  :表示在堆空间内创建了一个Vehicle ...

  3. Hibernate - 配置c3p0

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuratio ...

  4. 实现两个窗口通信方法-postMessage

    此方案可解决跨域而且跨Iframe,而且http和https之间的交互 首先来看一下基本的语法 otherWindow.postMessage(message, targetOrigin, [tran ...

  5. xxx was built without full bitcode" 编译错误解决

    xxx was built without full bitcode" 编译错误解决 iOS 打包上线 All object files and libraries for bitcode ...

  6. 机器学习 Support Vector Machines 2

    优化的边界分类器 上一讲里我们介绍了函数边界和几何边界的概念,给定一组训练样本,如果能够找到一条决策边界,能够使得几何边界尽可能地大,这将使分类器可以很可靠地预测训练样本,特别地,这可以让分类器用一个 ...

  7. 【leetcode刷题笔记】Binary Tree Level Order Traversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  8. [原]NYOJ-无线网络覆盖-199

    大学生程序代写 /*无线网络覆盖 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 我们的乐乐同学对于网络可算得上是情有独钟,他有一个计划,那就是用无线网覆盖郑州大学. 现 ...

  9. luogu1353 Running

    dp[i][j]表示走i分钟疲劳值为j时的最远距离 然后搞一下就好啦 #include <iostream> #include <cstdio> #include <al ...

  10. POJ3080 POJ3450Corporate Identity(广义后缀自动机||后缀数组||KMP)

    Beside other services, ACM helps companies to clearly state their “corporate identity”, which includ ...