jsp实现文件上传下载功能

当初学习Javaweb时做的小demo,没想到有许多小伙伴可以刷到,如果对你有帮助的话,帮忙Star一下,

源码已放到码云上:https://gitee.com/zhongxia621/mywebproject

文件上传首先得引入两个jar包,建议在mvn库中下载,下载完粘贴到lib目录下

首先写上传文件的jsp界面

<form action="UpLoadServet" method="post" enctype="multipart/form-data">
<font color="white" size="5px">文件上传功能(将你的照片,音乐,视频或者文档等经过上传分享到我的电脑)</font><br><br>
学号:<input name="sno"><br><br>
姓名:<input name="sname"><br><br>
上传文件:<input type="file" name="spicture"><br><br>
<input type="submit" value="上传"><br><br>
<font color="white" size="5px">文件下载功能(可以下载我在tomcat服务器上传的文件)</font><br><br>
</form>

接下来写上传功能的Servlet(主要就是重写它的doget方法,首先将请求,响应编码设为utf-8,接下来判断提交数据是否为表单数据,接下来创建文件上传解析对象,返回一个list集合,然后迭代器遍历,获取文件名称,最后创建你要保存的路径,调用write方法写入自己电脑)

package com.student.servlet;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class UpLoadServet
 */
public class UpLoadServet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UpLoadServet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=UTF-8");
		boolean isMultipart=ServletFileUpload.isMultipartContent(request);
		if(isMultipart)
		{
			FileItemFactory factory=new DiskFileItemFactory();
			ServletFileUpload upload=new ServletFileUpload(factory);
			try {
				List<FileItem> items=upload.parseRequest(request);
				Iterator<FileItem> it = items.iterator();
				while(it.hasNext())
				{
					FileItem item = it.next();
					String itemname = item.getFieldName();
					int sno=-1;
					String sname=null;
					
					if(item.isFormField())
					{
						if(itemname.equals("sno"))
						{
							sno=Integer.parseInt(item.getString("utf-8"));
						}else if(itemname.equals("sname"))
						{
							sname=item.getString("utf-8");
							sname=item.getName();
						}else
						{
							System.out.println("其他字段");
						}
					}else
					{
						String filename=item.getName();
						//String path=request.getSession().getServletContext().getRealPath("upload");
						String path="E:\\upload";
						File file=new File(path,filename);
						item.write(file);
						request.setAttribute("news", filename+"上传成功,谢谢分享");
						request.getRequestDispatcher("print.jsp").forward(request, response);
						//System.out.println(filename+"上传成功!!!");
						return;
					}
					
				}
			} catch (FileUploadException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

效果:

上传成功后去我的E盘upload目录下去检查:

文件上传功能对于文件类型大小没有限制,如果要想设置格式的话建议直接substring方法获取.之后的字母,判断是什么类型,还有maxsize方法控制上传文件大小。

 

接下来实现文件下载功能,这个不需要jar包

主要思路:

客户端请求servlet,servlet通过文件地址,将文件转为输入流,读到Servlet中,通过输出流将文件输出给用户

首先写文件下载jsp界面(可以通过获取文件夹目录方便,以后有待优化)

<font color="white" size="5px">文件下载功能(可以下载我在tomcat服务器上传的文件)</font><br><br>
</form>
<font color="#B2DFEE" size="5px">tomcat服务器文件</font><br><br>
<a href="DownLoadServlet?filename=测试.txt"><font color="green" size="4px">测试文档</font></a><br>
<a href="DownLoadServlet?filename=1.jpg"><font color="green" size="4px">照片1</font></a><br>
<a href="DownLoadServlet?filename=2.jpg"><font color="green" size="4px">照片2</font></a><br>
<a href="DownLoadServlet?filename=3.jpg"><font color="green" size="4px">照片3</font></a><br>
<a href="DownLoadServlet?filename=4.jpg"><font color="green" size="4px">照片4</font></a><br><br>
<a href="zhuce.jsp"><font color="white" size="5px">点此回到首页</font></a>

效果:

接下来写下载的Servlet(首先获取filename,然后通过获取user-agent字符串来了解用户是通过什么浏览器访问从而解决中文乱码问题,我只写了个谷歌和IE浏览器的,接下来就是将文件地址转为输入流,服务端响应转为输出流给用户,)

package com.student.servlet;

import java.io.IOException;
import java.io.InputStream;
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;



/**
 * Servlet implementation class DownLoadServlet
 */
public class DownLoadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DownLoadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	String filename = request.getParameter("filename");	
	response.addHeader("content-Type", "application/octet-stream");
	
	String agent = request.getHeader("User-Agent");
	
	 if(agent.toLowerCase().indexOf("chrome")>0)
	{
		response.addHeader("content-Disposition", "attachment;filename="+new String(filename.getBytes("UTF-8"), "ISO8859-1"));
	}
	else
	{
		response.addHeader("content-Disposition", "attachment;filename="+URLEncoder.encode(filename, "UTF-8"));
	}
	InputStream in = getServletContext().getResourceAsStream("/download/"+filename);
	ServletOutputStream out = response.getOutputStream();
	byte[] bs=new byte[1024];
	int len=-1;
	while((len=in.read(bs))!=-1)
	{
		out.write(bs,0,len);
	}
	out.close();
	in.close();
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

文件下载效果:

差不多就写完了,感觉上传下载还有方面需要进一步优化,有待更新。

 

本代码主要应用的是jsp技术,而实现文件上传功能,这个功能也是比较常见的,也是比较常用的,更是在网络中比较流行的。 技术为创建显示动态生成内容的Web页面提供了一个简捷而快速的方法。JSP技术的设计目的是使得构造基于Web的应用程序更加容易和快捷,而这些应用程序能够与各种Web服务器,应用服务器,浏览器和开发工具共同工作。 Web应用开发的JavaServer Pages技术方法 在开发JSP规范的过程中,太阳微系统公司(Sun Microsystems Inc.)与许许多多主要的Web服务器、应用服务器和开发工具供应商,以及各种各样富有经验的开发团体进行合作。其结果是找到了一种为应用和页面开发人员平衡了可移植性和易用性的开发方法。 JSP技术在多个方面加速了动态Web页面的开发: 将内容的生成和显示进行分离 使用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面。使用JSP标识或者小脚本来生成页面上的动态内容(内容是根据请求来变化的,例如请求帐户信息或者特定的一瓶酒的价格)。生成内容的逻辑被封装在标识和JavaBeans组件中,并且捆绑在小脚本中,所有的脚本在服务器端运行。如果核心逻辑被封装在标识和Beans中,那么其他人,如Web管理人员和页面设计者,能够编辑和使用JSP页面,而不影响内容的生成。 在服务器端,JSP引擎解释JSP标识和小脚本,生成所请求的内容(例如,通过访问JavaBeans组件,使用JDBCTM技术访问数据库,或者包含文件),并且将结果以HTML(或者XML)页面的形式发送回浏览器。这有助于作者保护自己的代码,而又保证任何基于HTML的Web浏览器的完全可用性。 强调可重用的组件 绝大多数JSP页面依赖于可重用的,跨平台的组件(JavaBeans或者Enterprise JavaBeansTM组件)来执行应用程序所要求的更为复杂的处理。开发人员能够共享和交换执行普通操作的组件,或者使得这些组件为更多的使用者或者客户团体所使用。基于组件的方法加速了总体开发过程,并且使得各种组织在他们现有的技能和优化结果的开发努力中得到平衡。 采用标识简化页面开发 Web页面开发人员不会都是熟悉脚本语言的编程人员。JavaServer Page技术封装了许多功能,这些功能是在易用的、与JSP相关的XML标识中进行动态内容生成所需要的。标准的JSP标识能够访问和实例化JavaBeans组件,设置或者检索组件属性,下载Applet,以及执行用其他方法更难于编码和耗时的功能。 通过开发定制化标识库,JSP技术是可以扩展的。今后,第三方开发人员和其他人员可以为常用功能创建自己的标识库。这使得Web页面开发人员能够使用熟悉的工具和如同标识一样的执行特定功能的构件来工作。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值