文件上传(FileUpload)
文件上传
Jsp:
1.input的type属性设置为file(在layui、bootstrap等地方也可以找到更好看的控件)
2.form表单的method设置为post。(get请求会将文件名传给服务器,而不是文件本身,也就是传过去一个字符串)
3.form表单的enctype属性设置为 multipart/form-data(这种情况下将以二进制的形式传输数据)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>upload</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="提交">
</form>
</body>
</html>
Servlet:
测试文本:
Java Web,是用Java技术来解决相关web互联网领域的技术栈。
web包括:web服务端和web客户端两部分。
Java在客户端的应用有Java Applet,不过使用得很少,Java在服务器端的应用非常的丰富,比如Servlet,JSP、第三方框架等等。
Java技术对Web领域的发展注入了强大的动力。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
下面是文件上传代码:
package com.wildfire.servlet.upload;
import com.wildfire.servlet.HttpServlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@WebServlet("/upload")
public class upload extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过输入流获取从客户端传来的数据。
//使读取速度加快
//字节流
InputStream inputStream=req.getInputStream();
//字符流
Reader reader=new InputStreamReader(inputStream);
//缓冲流
BufferedReader bufferedReader=new BufferedReader(reader);
//通过输出流将数据输出到本地应用
//获取文件夹的绝对路径,file是文件夹的名称,ceshifuben.txt要输出到的txt文件
//要注意这里的file的创建位置,不能直接在IDEA里面创建,需要找到自己的工程目录,在其中的out文件夹下找到artifacts再在相应项目下创建file
String path=req.getServletContext().getRealPath("/file/ceshifuben.txt");
//输出流
OutputStream outputStream=new FileOutputStream(path);
//输出字节流
Writer writer=new OutputStreamWriter(outputStream);
//输出缓冲流
BufferedWriter bufferedWriter=new BufferedWriter(writer);
//写入
String str="";
//注意这里是两个括号
while((str=bufferedReader.readLine())!=null){
bufferedWriter.write(str);
}
//关闭输入输出流
bufferedReader.close();
bufferedWriter.close();
writer.close();
reader.close();
inputStream.close();
outputStream.close();
}
}
要注意这里的file的创建位置,不能直接在IDEA里面创建,需要找到自己的工程目录,在其中的out文件夹下找到artifacts再在相应项目下创建file
例如我的创建位置:D:\WorkPlace\IntellijIDEAWorkPlace\IntellijIDEAJavaWebWorkPlace\javaweb学习1\out\artifacts\javaweb1_war_exploded2\file
得到的文本如下:
-----------------------------39165874219639205374108370503Content-Disposition: form-data; name="file"; filename="ceshi.txt"Content-Type: text/plainJava Web,是用Java技术来解决相关web互联网领域的技术栈。web包括:web服务端和web客户端两部分。Java在客户端的应用有Java Applet,不过使用得很少,Java在服务器端的应用非常的丰富,比如Servlet,JSP、第三方框架等等。Java技术对Web领域的发展注入了强大的动力。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。-----------------------------39165874219639205374108370503--
没有完成段落的划分,而且前后各多了一串字符,这是浏览器的附加信息。虽然能完成文件上传,但是效果并不是很好,所以我们大多采用以下方法:
使用FileUpload组件。
第一步:导入jar包:commons-fileupload-1.4.jar、commons-io-2.8.0.jar(使用IDEA时要注意这两个包需要同时导入)。
第二步:使用fileupload
fileupload组件可以将所有请求信息都解析成一个fileupload对象,我们可以通过对fileupload对象的操作完成上传,体现了面向对象的思想。
虽然使用字节流缓冲流读取输出速度更快,但是如果输出的文字需要换行或者是图片,就必须使用字节流,字节流能读取换行符,而且可以传输图片。
代码如下:
package com.wildfire.servlet.upload;
import com.wildfire.servlet.HttpServlet;
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;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
@WebServlet("/upload")
public class upload extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
DiskFileItemFactory fileItemFactory=new DiskFileItemFactory();
ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);
List<FileItem> list=servletFileUpload.parseRequest(req);
for(FileItem fileItem:list){
//判断是否是文件
if(fileItem.isFormField()){
//不是文件,是文本框等其他控件
String name=fileItem.getName();
//设置字符集为UTF-8
String value=fileItem.getString("UTF-8");
//在控制台输出文本框的name和value值
System.out.println(name+":"+value);
}else{
//是文件
String filename=fileItem.getName();
long size=fileItem.getSize();
System.out.print(filename+":"+size+":"+"Byte");
//读入
InputStream inputStream=fileItem.getInputStream();
/*Reader reader=new InputStreamReader(inputStream);
BufferedReader bufferedReader=new BufferedReader(reader);*/
//寻找路径,创建文件
String path=req.getServletContext().getRealPath("file/"+filename);
OutputStream outputStream=new FileOutputStream(path);
/*Writer writer=new OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter=new BufferedWriter(writer);*/
int temp=0;
while((temp=inputStream.read())!=-1){
outputStream.write(temp);
}
/*bufferedReader.close();
writer.close();*/
outputStream.close();
/* bufferedWriter.close();
reader.close();*/
inputStream.close();
System.out.println("上传成功!");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
这是使用fileupload之后得到的文件:
Java Web,是用Java技术来解决相关web互联网领域的技术栈。
web包括:web服务端和web客户端两部分。
Java在客户端的应用有Java Applet,不过使用得很少,Java在服务器端的应用非常的丰富,比如Servlet,JSP、第三方框架等等。
Java技术对Web领域的发展注入了强大的动力。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
可以很明显的看出和源文件一致。