Java Web---文件上传与下载(1)


先把 新鲜出炉、香饽饽的代码 为您奉上! 萌萌哒


软件: Eclipse、tomcat
技术: JSP、Servlet
插件下载: commons-fileupload
commons-io


demo规划

在这里插入图片描述


DownloadServlet

package com.bjpowernode.servlet;

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.tomcat.util.http.fileupload.FileUploadException;

@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	
		String fileName = request.getParameter("name");
		String fileNameCopy = fileName;
		
		// 打散:按当前字符编码进行打散
		byte[] bytes = fileName.getBytes("UTF-8");
		// 组装:按目标字符编码进行组装
		fileName = new String(bytes, "ISO8859-1");
		
		// 修改响应的头部属性 content-disposition 值为 attachment
		response.setHeader("content-disposition", "attachment;filename=" + fileName);
		
		// 获取连接服务器资源文件的输入流
		InputStream is = this.getServletContext().getResourceAsStream("/resource/" + fileNameCopy);
		
		// 获取输出流
		ServletOutputStream os = response.getOutputStream();
		
		// 将输入流中的数据写入输出流
		int len = -1;
		byte[] buf = new byte[1024];
		while((len = is.read(buf)) != -1) {
			os.write(buf, 0, len);
		}
		
		// 关闭流
		os.close();
		is.close();
	}
}


RegisterServlet

package com.bjpowernode.servlet;

import java.io.*;
import java.util.*;
import javax.servlet.ServletException;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.tomcat.util.http.fileupload.FileUploadException;

/**
 * Servlet implementation class RegisterServlet
 */
@WebServlet("/RegisterServlet")
public class RegisterServlet extends HttpServlet {
	
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		// 1.判断请求是否为 mutilpart 请求
		if(!ServletFileUpload.isMultipartContent(request)) {
			throw new RuntimeException("当前请求不支持文件上传!");
		}		
		
	
	    DiskFileItemFactory factory = new DiskFileItemFactory();   // 2.创建一个 fileItem 工厂	 
	    
	    /**
	     * 扩展一:设置文件上传大小
	     * 
	     */
	    // 设置使用临时文件的边界值,大于该值,上传文件会先保存在临时文件中,否则,上传文件将直接携入到内存中
	    // 单位:字节。设置边界值为 1 M
	    factory.setSizeThreshold(1024 * 1024 * 1);
	    // 设置临时文件
	    String tempPath = this.getServletContext().getRealPath("/temp");
	    File temp = new File(tempPath);
	    factory.setRepository(temp);
	    /**
	     * 扩展一结束
	     */
	    
	    ServletFileUpload upload = new ServletFileUpload(factory); // 3.创建文件上传核心组件  
		  
	    
	    /**
	     * 扩展二:解决乱码问题
	     * 2.解决上传文件名的乱码问题
	     */
	    // 设置响应 item 的头部字符编码,解决文件乱码问题
	    upload.setHeaderEncoding("UTF-8");
	    /**
	     * 扩展二 --2:结束
	     */
    	try {    
			List<FileItem> items = upload.parseRequest(request);   // 解析请求
			
			// 遍历 items
			for(FileItem item : items) {
				// item 为普通表单项
				if(item.isFormField()) {
					String fieldName = item.getFieldName();  // 获取表单项的名称
					
					/*  原版本
					String fieldValue = item.getString();    // 获取表单项的值
					*/
					
					/**
					 * 扩展二:解决中文乱码问题    
					 * 1.普通表单乱码问题
					 */
					String fieldValue = item.getString("UTF-8");    // 获取表单项的值
					/**
					 * 扩展二:结束
					 */
					
					System.out.println(fieldName + " = " + fieldValue);
				}
			    // item 为文件表单项
				else {
					String fileName = item.getName();   // 获取上传文件的原始名称
					
					/**
					 * 扩展三:解决上传同名文件覆盖问题
					 */
					fileName = System.currentTimeMillis() + fileName;
					/**
					 * 扩展三:结束
					 */
					
					InputStream is = item.getInputStream();  // 获取包含文件上传内容的输入流
					String path = this.getServletContext().getRealPath("/images"); // 获取文件保存在服务器中的路径
					File descFile = new File(path, fileName);  // 创建目标文件,用于保存上传文件
					OutputStream os = new FileOutputStream(descFile);  // 创建文件输出流
					
					// 输入流中数据写入到输出流
					int len = -1;
					byte[] buf = new byte[1024];
					while((len = is.read(buf)) != -1) {
						os.write(buf, 0, len);
					}
					
					// 关闭流
					os.close();
					is.close();
					
					/**
					 * 扩展一:将临时储存的文件转存
					 */
					item.delete();
					/**
					 * 扩展一:结束
					 */
				}
			}
			request.getRequestDispatcher("index.jsp").forward(request, response);
		} 
	    catch (org.apache.commons.fileupload.FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}   
    }
}

/**
 * 扩展四:限制文件的上传大小
 * 扩展五:实现上传文件不同文件夹的转存
 * 
 * 以上两个扩展在此省略
 */


download1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

   <!-- 超链接实现下载    -->
   <a href="${pageContext.request.contextPath }/resource/1.txt">1.txt</a><br>
   <a href="${pageContext.request.contextPath }/resource/beauty1.JPG">beauty1.JPG</a><br>
   <a href="${pageContext.request.contextPath }/resource/Diana Boncheva - Purple Passion.mp3">Diana Boncheva - Purple Passion.mp3</a><br>
   <a href="${pageContext.request.contextPath }/resource/Ethno Music Project - Childhood Memory.mp3">Ethno Music Project - Childhood Memory.mp3</a><br>
   <a href="${pageContext.request.contextPath }/resource/night.gif">night.gif</a><br>
   <a href="${pageContext.request.contextPath }/resource/Omar Akram - Take My Hand.mp3">Omar Akram - Take My Hand.mp3</a><br>
   <a href="${pageContext.request.contextPath }/resource/Richard Clayderman - 梦中的婚礼.mp3">Richard Clayderman - 梦中的婚礼.mp3</a><br>
</body>
</html>

download2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<a href="${pageContext.request.contextPath }/DownloadServlet">下载</a><br>

</body>
</html>

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HHHH</title>
</head>
<body>
     <form  action="${pageContext.request.contextPath }/RegisterServlet" method="post" enctype="multipart/form-data">
         <table width="200px">
           <tr>
             <th colign="center">姓名</th>
             <th><input type="text" name="name"/></th>
           </tr>   
           <tr>
             <th colign="center">年龄</th>
             <th><input type="text" name="age"/></th>
           </tr> 
           <tr>
             <th colign="center">文件</th>
             <th><input type="file" name="file"/></th>
           </tr> 
           <tr>
             <th  colspan="2"><button type="button">上传</button></th>
           </tr> 
         </table>
     </form>
 </body>
</html>

PS:为了让 demo 运行起来,你只需要按 将创建文件夹即可,之后 happlily copy cade 之后就完事了。


项目具体介绍请 转至

项目打包下载:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值