Servlet文件上传下载
今天我们来学习Servlet文件上传下载
Servlet文件上传主要是使用了ServletInputStream读取流的方法,其读取方法与普通的文件流相同。
一.文件上传相关原理
第一步,构建一个upload.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>My JSP 'index.jsp' starting page</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">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <body>
- <form enctype="application/x-www-form-urlencoded" action="${pageContext.request.contextPath }/servlet/UploadServlet1" method="post">
- <input type="text" name="name" value="name" /><br/>
- <div id="div1">
- <div>
- <input type="file" name="photo" />
- </div>
- </div>
- <input type="submit" name="上传" /><br/>
- </form>
- </body>
- </html>
第二步,构建一个servlet UploadServlet1.java
- package com.zk.upload;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.ServletInputStream;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class UploadServlet1 extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- String name=request.getParameter("name");
- String photo=request.getParameter("photo");
- ServletInputStream inputstream=request.getInputStream();
- int len=0;
- byte[] b=new byte[1024];
- while((len=inputstream.read(b))!=-1){
- System.out.println(new String(b,0,len));
- }
- inputstream.close();
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- ServletInputStream inputstream=request.getInputStream();
- int len=0;
- byte[] b=new byte[1024];
- while((len=inputstream.read(b))!=-1){
- System.out.println(new String(b,0,len));
- }
- inputstream.close();
- }
- /**
- * Initialization of the servlet. <br>
- *
- * @throws ServletException if an error occurs
- */
- public void init() throws ServletException {
- // Put your code here
- }
- }
最后执行UploadServlet1.java之后,输出上传文件的信息。
这里涉及到文件上传的相关原理,在我本地浏览器中调试显示信息如下:
这是一些有关文件上传的相关信息。
二.文件上传
接下来,我们开始进行文件上传的工作。
第一部,创建jsp
这里的form表单需要更改一下enctype属性,这个属性是规定在发送到服务器之前应该如何对表单数据进行编码。
- <%@ 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>My JSP 'index.jsp' starting page</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 enctype="multipart/form-data" action="${pageContext.request.contextPath }/servlet/UploadServlet2" method="post">
- <input type="text" name="name" value="name" /><br/>
- <div id="div1">
- <div>
- <input type="file" name="photo" />
- </div>
- </div>
- <input type="submit" name="上传" /><br/>
- </form>
- </body>
- </html>
UploadServlet2.java
- package com.zk.upload;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.PrintWriter;
- import java.io.UnsupportedEncodingException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import java.util.List;
- import java.util.UUID;
- 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.FileUploadBase;
- import org.apache.commons.fileupload.FileUploadException;
- import org.apache.commons.fileupload.disk.DiskFileItemFactory;
- import org.apache.commons.fileupload.servlet.ServletFileUpload;
- import org.apache.commons.io.FilenameUtils;
- public class UploadServlet2 extends HttpServlet {
- /**
- * Constructor of the object.
- */
- public UploadServlet2() {
- super();
- }
- /**
- * Destruction of the servlet. <br>
- */
- public void destroy() {
- super.destroy(); // Just puts "destroy" string in log
- // Put your code here
- }
- /**
- * The doGet method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to get.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //优先级不高
- request.setCharacterEncoding("UTF-8");
- //要执行文件上传的操作
- //判断表单是否支持文件上传
- boolean isMultipartContent=ServletFileUpload.isMultipartContent(request);
- if(!isMultipartContent){
- throw new RuntimeException("your form is not multipart/form-data");
- }
- //创建一个DiskFileItemFactory工厂类
- DiskFileItemFactory factory=new DiskFileItemFactory();
- //创建一个ServletFileUpload核心对象
- ServletFileUpload sfu=new ServletFileUpload(factory);
- //解决上传表单乱码的问题
- sfu.setHeaderEncoding("UTF-8");
- try {
- //限制上传文件的大小
- //sfu.setFileSizeMax(1024);
- //sfu.setSizeMax(6*1024*1024);
- //解析requst对象,得到一个表单项的集合
- List<FileItem> fileitems=sfu.parseRequest(request);
- //遍历表单项数据
- for(FileItem fileItem:fileitems){
- if(fileItem.isFormField()){
- //普通表单项
- processFormField(fileItem);
- }
- else{
- //上传表单项
- processUploadField(fileItem);
- }
- }
- } catch(FileUploadBase.FileSizeLimitExceededException e){
- throw new RuntimeException("文件过大");
- }catch (FileUploadException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- private void processUploadField(FileItem fileItem) {
- // TODO Auto-generated method stub
- //得到上传的名字
- String filename=fileItem.getName();
- //得到文件流
- try {
- InputStream is=fileItem.getInputStream();
- String dictory=this.getServletContext().getRealPath("/upload");
- System.out.println(dictory);
- //创建一个存盘的路径
- File storeDirecctory=new File(dictory);//既代表文件又代表目录
- if(!storeDirecctory.exists()){
- storeDirecctory.mkdirs();//创建一个指定目录
- }
- //处理文件名
- filename=filename.substring(filename.lastIndexOf(File.separator)+1);
- if(filename!=null){
- filename=FilenameUtils.getName(filename);
- }
- //解决文件同名的问题
- filename=UUID.randomUUID()+"_"+filename;
- //目录打散
- //String childDirectory=makeChildDirectory(storeDictory);//2015-10-
- String childDirectory=makeChildDirectory2(storeDirecctory,filename);
- //System.out.println(childDirectory);
- //上传文件,自动删除临时文件
- fileItem.write(new File(storeDirecctory,childDirectory+File.separator+filename));
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- //上传表单项
- private void processUploadField1(FileItem fileItem) {
- // TODO Auto-generated method stub
- //得到上传的名字
- String filename=fileItem.getName();
- //得到文件流
- try {
- //得到文件流
- InputStream is=fileItem.getInputStream();
- String dictory=this.getServletContext().getRealPath("/upload");
- System.out.println(dictory);
- //创建一个存盘的路径
- File storeDictory=new File(dictory);//既代表文件又代表目录
- if(!storeDictory.exists()){
- storeDictory.mkdirs();//创建一个指定目录
- }
- //处理文件名
- filename=filename.substring(filename.lastIndexOf(File.separator)+1);
- if(filename!=null){
- filename=FilenameUtils.getName(filename);
- }
- //解决文件同名的问题
- filename=UUID.randomUUID()+"_"+filename;
- //目录打散
- //String childDirectory=makeChildDirectory(storeDictory);//2015-10-
- String childDirectory2=makeChildDirectory2(storeDictory,filename);
- //System.out.println(childDirectory);
- //在storeDictory目录下创建完整的文件
- //File file=new File(storeDictory,filename);
- //File file=new File(storeDictory,childDirectory+File.separator+filename);
- File file2=new File(storeDictory,childDirectory2+File.separator+filename);
- //通过文件输出流将上传的文件保存到磁盘
- //FileOutputStream fos=new FileOutputStream(file);
- FileOutputStream fos2=new FileOutputStream(file2);
- int len=0;
- byte[] b=new byte[1024];
- while((len=is.read(b))!=-1){
- // fos.write(b,0,len);
- fos2.write(b,0,len);
- }
- //fos.close();
- fos2.close();
- is.close();
- System.out.println("success");
- //删除临时文件
- fileItem.delete();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- //目录打散
- private String makeChildDirectory(File storeDictory) {
- // TODO Auto-generated method stub
- SimpleDateFormat sm=new SimpleDateFormat("yyyy-MM-dd");
- String date=sm.format(new Date());
- //创建目录
- File file=new File(storeDictory,date);
- if(!file.exists()){
- file.mkdirs();
- }
- return date;
- }
- //目录打散
- private String makeChildDirectory2(File storeDictory,String filename){
- int hashcode=filename.hashCode();
- System.out.println(hashcode);
- String code=Integer.toHexString(hashcode);
- String childDirectory=code.charAt(0)+File.separator+code.charAt(1);
- //创建指定目录
- File file=new File(storeDictory,childDirectory);
- if(!file.exists()){
- file.mkdirs();
- }
- return childDirectory;
- }
- //普通表单项
- private void processFormField(FileItem fileItem) {
- // TODO Auto-generated method stub
- String fieldname=fileItem.getFieldName();
- try {
- String valuename=fileItem.getString("UTF-8");
- // fieldname=new String(valuename.getBytes("iso-8859-1"),"utf-8");
- System.out.println(fieldname+":"+valuename);
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- /**
- * The doPost method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to post.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- request.setCharacterEncoding("UTF-8");
- //要执行文件上传的操作
- //判断表单是否支持文件上传
- boolean isMultipartContent=ServletFileUpload.isMultipartContent(request);
- if(!isMultipartContent){
- throw new RuntimeException("your form is not multipart/form-data");
- }
- //创建一个DiskFileItemFactory工厂类
- DiskFileItemFactory factory=new DiskFileItemFactory();
- //产生临时文件
- factory.setRepository(new File("f:\\temp"));
- //创建一个ServletFileUpload核心对象
- ServletFileUpload sfu=new ServletFileUpload(factory);
- sfu.setHeaderEncoding("UTF-8");
- try {
- //限制上传文件的大小
- //sfu.setFileSizeMax(1024*1024*1024);
- //sfu.setSizeMax(6*1024*1024);
- //解析requst对象,得到一个表单项的集合
- List<FileItem> fileitems=sfu.parseRequest(request);
- //遍历表单项数据
- for(FileItem fileItem:fileitems){
- if(fileItem.isFormField()){
- //普通表单项
- processFormField(fileItem);
- }
- else{
- //上传表单项
- processUploadField(fileItem);
- }
- }
- } catch(FileUploadBase.FileSizeLimitExceededException e){
- //throw new RuntimeException("文件过大");
- System.out.println("文件过大");
- }catch (FileUploadException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- /**
- * Initialization of the servlet. <br>
- *
- * @throws ServletException if an error occurs
- */
- public void init() throws ServletException {
- // Put your code here
- }
- }
这里面加了文件大小限制、文件重命名、目录打散等方法。
最后,我们运行一下这个demo
我们在web-apps的目录下可以看到我们刚刚上传的文件
三.文件下载
现在我们进行文件下载
- package com.zk.upload;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.net.URLEncoder;
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class DownloadServlet1 extends HttpServlet {
- /**
- * Constructor of the object.
- */
- public DownloadServlet1() {
- super();
- }
- /**
- * Destruction of the servlet. <br>
- */
- public void destroy() {
- super.destroy(); // Just puts "destroy" string in log
- // Put your code here
- }
- /**
- * The doGet method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to get.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //设置一个要下载的文件
- String filename="a.csv";
- filename=new String(filename.getBytes("UTF-8"),"iso-8859-1");
- //告知浏览器要下载文件
- response.setHeader("content-disposition", "attachment;filename="+filename);
- response.setContentType(this.getServletContext().getMimeType(filename));//根据文件明自动获取文件类型
- response.setCharacterEncoding("UTF-8");//告知文件用什么服务器编码
- PrintWriter pw=response.getWriter();
- pw.write("Hello,world");
- }
- /**
- * The doPost method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to post.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request,response);
- }
- /**
- * Initialization of the servlet. <br>
- *
- * @throws ServletException if an error occurs
- */
- public void init() throws ServletException {
- // Put your code here
- }
- }
首先指定一个需要下载的文件的文件名,然后告知浏览器需要下载文件,根据文件明自动获取文件类型,并告知文件用什么服务器编码。执行servlet后,会下载一个名为
a.csv的文件。
下载后,可以看到文件中存有Hello,world字符。
Servlet文件上传下载的更多相关文章
- java中的文件上传下载
java中文件上传下载原理 学习内容 文件上传下载原理 底层代码实现文件上传下载 SmartUpload组件 Struts2实现文件上传下载 富文本编辑器文件上传下载 扩展及延伸 学习本门课程需要掌握 ...
- jsp+servlet实现文件上传下载
相关素材下载 01.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- SpringMVC文件上传下载
在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...
- salesforce 零基础学习(四十二)简单文件上传下载
项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文 ...
- commons-fileupload实现文件上传下载
commons-fileupload是Apache提供的一个实现文件上传下载的简单,有效途径,需要commons-io包的支持,本文是一个简单的示例 上传页面,注意设置响应头 <body> ...
- JavaWeb实现文件上传下载功能实例解析
转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...
- JAVA Web 之 struts2文件上传下载演示(一)(转)
JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...
- java web 文件上传下载
文件上传下载案例: 首先是此案例工程的目录结构:
- 2013第38周日Java文件上传下载收集思考
2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...
随机推荐
- PAT (Basic Level) Practice (中文)1043 输出PATest (20 分)
给定一个长度不超过 1 的.仅由英文字母构成的字符串.请将字符重新调整顺序,按 PATestPATest.... 这样的顺序输出,并忽略其它字符.当然,六种字符的个数不一定是一样多的,若某种字符已经输 ...
- Cloudera Manager和CDH版本的对应关系
来源:https://www.cloudera.com/documentation/enterprise/release-notes/topics/rn_consolidated_pcm.html#c ...
- ArcMap 导入自定义样式Symbols
管网的图例里有一些自定义的样式,这些在ArcMap中找不到,找到的也不合适,所以只能自己动手制作. 1. 菜单 Customize --> Style Manager 2 . 创建新的Style ...
- linux C++ 读取mysql结果保存
c++读取mysql数据库结果保存 #include <fstream> #include <iomanip> #include <iostream> #inclu ...
- Ubuntu18.04安装mysql(AWS云)
1.执行如下三条命令 sudo apt-get install mysql-server sudo apt install mysql-client sudo apt install libmysql ...
- Oracle 中关于 Group By 子句与多行函数嵌套搭配使用的注意事项
目录 你需要知道的 啥叫单行函数 啥叫多行函数 如何理解这个概念 Group by 子句使用规则 看一道 071 考题 你需要知道的 提到 Group by 子句,你需要先理解一个东西:函数的分类.提 ...
- Dubbo的SPI机制与JDK机制的不同及原理分析
从今天开始,将会逐步介绍关于DUbbo的有关知识.首先先简单介绍一下DUbbo的整体概述. 概述 Dubbo是SOA(面向服务架构)服务治理方案的核心框架.用于分布式调用,其重点在于分布式的治理. 简 ...
- php文件上传 form表单形式
1.php界面 <?php header( 'Content-Type:text/html;charset=utf-8 ');include_once("conn/conn.php&q ...
- [CF1034A] Two Rabbits - 数学
判断能否整除即可 #include <bits/stdc++.h> using namespace std; int x,y,a,b; int main() { int t; ios::s ...
- Spring域属性自动注入byName和byType
byName 方式 <!--byName约束:bean当中的域属性名必须跟所注入bean的id相同--> <bean id="student" class=&qu ...