javaweb文件上传下载以及文件上传成功后可是目录中没有显示

通过看别人写的代码而后本身实际操做一遍,基本都是搬运也是为了练习。
说明:
   对于文件上传,浏览器在上传的过程当中是将文件以流的形式提交到服务器端的,若是直接使用Servlet获取上传文件的输入流而后再解析里面的请求参 数是比较麻烦,因此通常选择采用apache的开源工具common-fileupload这个文件上传组件。这个common-fileupload上 传组件的jar包能够去apache官网上面下载,也能够在struts的lib文件夹下面找到,struts上传的功能就是基于这个实现的。 common-fileupload是依赖于common-io这个包的,因此还须要下载这个包。

1:建立fileUpLoad.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="UploadServlet" method="post" enctype="multipart/form-data">  
        用户名: <input type="text" name="username" /><br>
        文件1: <input type="file" name="file1"><br>
        文件2: <input type="file" name="file2"><br>
        <input type="submit" value="上传文件">
</form>
</body>
</html>
2:建立展现上传状态的页面fileUploadResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>展现上传下载结果</title>
</head>
<body>
 上传状态:${messages}<br>          
 用户名 : ${requestScope.username} <br>
 文件1  : ${requestScope.file1 }<br>
 文件2 : ${requestScope.file2}<br>
</body>
</html>
3:建立servlet为:UploadServlet.java
package package1;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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;
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
  
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//获得上传文件的保存目录(为了文件的安全首先将其目录放在webroot目录下)
		String path=this.getServletContext().getRealPath("/upload");
		File file=new File(path);
		//判断上传的文件保存目录是否存在
		if(!file.exists() && !file.isDirectory()) {
			System.out.println(path + "目录不存在,须要建立!");
			//建立目录
			file.mkdir();
		}
		//消息显示
		String message="";
		try {
			//使用Apache上传文件,处理文件上传步骤
			//1:建立一个DiskFileItemFactory工厂
			DiskFileItemFactory factory=new DiskFileItemFactory();
			//2:建立一个文件上传解析器
			ServletFileUpload upload=new ServletFileUpload(factory);
			//解决中文乱码
			upload.setHeaderEncoding("UTF-8");
			//3:判断提交的表单为普通表单仍是带文件上传的表单
			if(!ServletFileUpload.isMultipartContent(request)) {
				//若是表单为普通数据表单,则按照传统的方式获取数据
				return;
			}
			//4.使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每个
                FileItem对应一个Form表单的输入项
			List<FileItem> list=upload.parseRequest(request);
			for(FileItem item:list) {
				//若是fileItem中封装的是普通输入项的数据
				if(item.isFormField()) {
					//获取字段名字
					String name=item.getFieldName();
					//解决普通输入项中中文乱码问题
					String value=item.getString("UTF-8");
					System.out.println(name + " = " + value);
				}else {
					//若是表单中提交的是上传文件
					//得到上传的文件名称
					String filename=item.getName();
					System.out.println(filename);
					if(filename==null || filename.trim().equals("")) {
						continue;
					}
					/**
					 * 注意:不一样的浏览器提交的文件名称是不同的,有些浏览器提交的文件会带有路径,
					 * 如“D:\\project\WebRoot\hello.jsp”,有一些是单纯的文件名:hello.jsp
					 */
					//去掉获取到文件名中的路径名,保留单纯的文件名
					filename=filename.substring(filename.lastIndexOf("\\")+1);
					//获取item中的上传文件的输入流
					InputStream in=item.getInputStream();
					//建立一个文件输入流
					FileOutputStream out=new FileOutputStream(path+"\\"+filename);
					//建立一个缓冲区
					byte buffer[] =new byte[1024];
					//判断输入流中的数据读取完毕
					int len = 0;
					//循环将输入流读入到缓冲区当中(len = in.read(buffer)>0)就表示in里面还有数据存在
					while ((len=in.read(buffer))>0) {
					//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(path+"\\"+filename)当中
						out.write(buffer, 0, len);
					}
					//关闭输入流
					in.close();
					//关闭输出流
					out.close();
					//删除处理文件上传时生成的的临时文件
					item.delete();
					message="上传成功";
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			message="文件上传失败";
			e.printStackTrace();
		}
		request.setAttribute("messages", message);
		request.getRequestDispatcher("/fileUploadResult.jsp").forward(request, response);
	}
}
4:配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>TestDemo3</display-name>
  <servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>package1.UploadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>
5:启动项目可能回出现:上传成功可是在本身定义的文件加下找不到上传的文件,能够这样修改下

 

6:下载功能:使用 response.getOutputStream(); 返回二进制数据流,实现文件下载
说明:
web项目大部分文件下载不须要写代码实现,只需经过超连接便可实现,就是经过超连接,在链接地址里写上文件的路径,浏览器会自动打开该文件,若是是普通的文本,图片等浏览器能直接显示内容的浏览器都能直接打开并显示,但若是是浏览器没法打开的文件,好比rar,docx,exe等等,那么浏览器就会提示你下载改文件或者使用当前系统自带的工具打开该文件
代码实现:
package package1;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

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;

@WebServlet("/doLoadServlet")
public class doLoadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		// 一、文件存放路径
        String path="D:\\eclips\\workspace\\TestDemo3\\WebContent\\upload";
        // 二、须要下载的文件名
        String fileName="/ss10.jpg";
        File file = new File(path+fileName);
        response.reset();
        response.setCharacterEncoding("UTF-8");
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setHeader("Content-Disposition", "attachment;fileName="+fileName);
        InputStream input = new FileInputStream(file);
        ServletOutputStream out = response.getOutputStream();
        byte[] buff =new byte[1024];
        int len ;
        while((len = input.read(buff)) != -1){
            out.write(buff, 0, len);
            out.flush();
        }
        input.close();
        out.close();
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

下载界面:doLoad.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="upload/ss10.jpg">文件下载</a>
</body>
</html>

配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>TestDemo3</display-name>
  <servlet>
    <servlet-name>doLoadServlet</servlet-name>
    <servlet-class>package1.doLoadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>doLoadServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

相关文章
相关标签/搜索