jsp中的文件上传与下载

一、开发环境的搭建:

工作准备

二、实现文件上传:

2.1. upload.jsp页面的代码如下:
upload.jsp页面的代码如下:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=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%>">
    <script type="text/javascript">
        function addFile(){
            var div = document.getElementById("files");
            div.innerHTML+="<div>文件:<input type='file' name='file'/><input type='button' value='删除' onclick='deleteFile(this)'/></div>";
        }

        function deleteFile(bt){
            var div = document.getElementById("files");
            div.removeChild(bt.parentNode);
        }
    </script>
  </head>

  <body>
  <center>
    <h1>邮件发送页面</h1>
    <!-- 上传的方式只能为post,因为只有post才能发流 -->
    <form action="upload" method="post" enctype="multipart/form-data">
        <table width="50%">
            <tr>
                <td width="15%">邮件主题</td><td><input type="text" name="info"/></td>
            </tr>

            <tr>
                <td>邮件附件</td><td><input type="button" value="添加附件" onclick="addFile()"/></td>
            </tr>
            <tr>
                <td colspan="2">
                <div id="files"></div>
                </td>
            </tr>

            <tr><td colspan="2"><input type="submit" value="提交"/></td></tr>
        </table>
    </form>
    </center>
  </body>
</html>

message.jsp页面的代码如下:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=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 'res.jsp' starting page</title>
  </head>
  <body>
    ${msg}
  </body>
</html>

2.2. 处理文件上传的Servlet
 UploadServlet的代码如下:

package com.bright;

import java.io.*;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.ws.rs.core.Request;

import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

public class UploadServlet extends HttpServlet {

    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req,resp);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //准备工作
        req.setCharacterEncoding("utf-8");

        //得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
        String path=this.getServletContext().getRealPath("/uploads");

        String temp=this.getServletContext().getRealPath("/temp");//设置一个临时目录
        String msg="";//定义提示信息

        //1、创建上传组件的工厂类
        DiskFileItemFactory factory=new DiskFileItemFactory();

        //setSizeThreshold方法用于设置是否将上传文件已临时文件的形式保存在磁盘的临界值(以字节为单位的int值),如果从没有调用该方法设置此临界值,将会采用系统默认值10KB
        factory.setSizeThreshold(1024*1024);//缓冲区大小为1M

        //setRepositoryPath方法用于设置当上传文件尺寸大于setSizeThreshold方法设置的临界值时,将文件以临时文件形式保存在磁盘上的存放目录
        factory.setRepository(new File(temp));

        //2、获取上传组件
        ServletFileUpload upload=new ServletFileUpload(factory);
        upload.setSizeMax(1024*1024*10);//上传文件最大为10M

        //设置监听器,可以监听上传的进度
        MyProgress listen=new MyProgress();
        upload.setProgressListener(listen);

        //3、创建一个文件上传解析器 从request得到所有上传域的列表
        try {
            //FileItem对象里面封装的数据是一个普通文本表单字段或者一个文件表单字段
            List<FileItem> list=upload.parseRequest(req);

            //4、遍历集合
            Iterator<FileItem> it=list.iterator();

            while(it.hasNext())
            {
                //5、取出表单中的数据放到FileItem中
                FileItem item=it.next();

                //6、判断你是否是文件如果是普通文本表单字段,返回一个true否则返回一个false
                if(item.isFormField())
                {
                    //不是文件 getFieldName方法用来返回表单标签的name属性的值。getString()方法将FileItem对象中保存的数据流内容以一个字符串返回
                    System.out.println(item.getFieldName()+"--"+item.getString());
                }else
                {
                    //是文件
                    //7、上传文件
                    String filename=item.getName();//文件名
                    InputStream in=item.getInputStream();//以流的形式返回上传文件的主体内容。

                    //8、将输入流通过输出流写到服务器的硬盘上
                    /*
                     * 文件名一般由程序生成 UUID 生成一个唯一的字符串作为名字
                     * 目录:根据日期来分散存放以日期命名的文件夹中
                     * 
                     * 存入数据库
                     *  ID,UUIDfile(服务器硬盘上的文件名),fileName(上传的时候叫什么名字),uploadtime,info...
                     */
                    File file=new File(path, filename);
                    OutputStream out=new FileOutputStream(file);

                    //9、将输入流的内容复制到输出流中使用IOUtils
                    IOUtils.copy(in, out);

                    //10、关闭流
                    in.close();
                    out.close();
                }

            }
            msg="恭喜你上传成功!!";

        } catch (FileSizeLimitExceededException e) {
            e.printStackTrace();
            msg="上传失败,最大只能传10M<a href='index.jsp'>重新上传</a>";

        }catch(Exception e){
            e.printStackTrace();
            msg="对不起,上传失败!<a href='index.jsp'>重新上传</a>";
        }
        req.setAttribute("msg", msg);

        /*实现请求转发的,当请求进入到该servlet中执行到该语句时,服务器不会直接响应而是转发到转发路径得servlet继续处理,由于将req和resp带过去了,所以这期间是没有重新创建request和response对象,
         * 所以在接下来的servlet中同样可以获得当前servlet的request中的参数。
         * */
        req.getRequestDispatcher("/res.jsp").forward(req, resp);
    }
}

在Web.xml文件中注册UploadServle

文件上传成功之后,上传的文件保存在了WEB-INF目录下的uploads目录,如下图所示:

2.3. 运行效果
上传
上传成功

2.4. 上传时的一些细节
2.4.1. 为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。

2.4.2. 为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名。

2.4.3. 在表单中设置 enctype=”multipart/form-data”

2.4.4. 要限制上传文件的最大值。

2.4.5. 要限制上传文件的类型,在收到上传文件名时,判断后缀名是否合法。

三、实现文件下载:

3.0. 准备工作:要先有存在的文件
现有存在的文件

3.1. 展示下载文件的download.jsp页面如下:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=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 'DownLoad.jsp' starting page</title>

  </head>

  <body>
  <!-- 在tomcat\apache-tomcat-7.0.65\webapps\jspday05\uploads下面要先存在需要下载的文件 -->
  <!-- 链接中要有文件的后缀名 -->
    <h3>文件下载</h3>
     <a href="download?filename=aaa.txt">aaa.txt</a><br/>
     <a href="download?filename=图书管理系统.docx">图书管理系统.docx</a><br/>
  </body>
</html>

3.2. DownLoadServlet的代码如下:

package com.bright;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

import sun.misc.BASE64Encoder;

public class DownLoadServlet extends HttpServlet {

    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //1、获取文件的信息
        String filename=req.getParameter("filename");
        System.out.println(filename);

        //2、用get传输时处理乱码问题,utf-8是页面上数据传输的格式,iso-8859-1是你java项目格式,目的是为了将中文文件名正确显示在页面上。
        //filename=new String(filename.getBytes("iso-8859-1"),"utf-8");

        //3、创建一个文件,把你读到的数据写进这个文件中
        String path=this.getServletContext().getRealPath("/uploads");
        InputStream in=new FileInputStream(new File(path,filename));

        //4、判断用户用的是什么浏览器在下载(并未区分)
        String useage=req.getHeader("User-Agent");
        if(useage.indexOf("MSIE")>0)
        {
            //是IE浏览器
            System.out.println("是IE");

            //处理中文乱码问题
            filename = URLEncoder.encode(filename,"UTF-8");     

        }else{
            //其他浏览器
            System.out.println("其他浏览器");
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?"+base64Encoder.encode(filename.getBytes("utf-8"))+"?=";
            System.out.println(filename);
        }

        //5、设置为下载application/x-download
        resp.setContentType("application/x-msdownload");        

        //6、文件下载,指定默认名
        resp.addHeader("Content-Disposition","attachment;filename=" + filename);  

        //7、向浏览器输出流对象
        OutputStream out=resp.getOutputStream();

        //8、将输入流中的内容复制到输出流中
        IOUtils.copy(in, out);

        //9、关闭流
        in.close();
        out.close();
    }


    public void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req,resp);
    }
}

3.3. 运行效果:
文件下载
下载页面

3.4. 细节:
3.4.1. <a href="download?filename=aaa.txt">aaa.txt</a><br/>文件名要有后缀

3.4.2. 在下载时要判断浏览器:
IE浏览器:使用URL编码
这里写图片描述

其他浏览器,使用BASE64编码
其他浏览器中

3.4.3. 将输入流中的内容复制到输出流中:

IOUtils.copy(in, out);

三、在web,xml中的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>com.bright.UploadServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>DownLoadServlet</servlet-name>
    <servlet-class>com.bright.DownLoadServlet</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/upload</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>DownLoadServlet</servlet-name>
    <url-pattern>/download</url-pattern>
  </servlet-mapping>    
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
commons-fileupload-1.2.1实现文件上传 需导入commons-fileupload-1.2.1.jar和 commons-io-1.3.2.jar upload2.jsp <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>文件上传</title> </head> <body> <form action="FileUploadServlet" method="post" enctype="multipart/form-data"> <input type="file" size="30" name="file01" /> <br /> <input type="file" size="30" name="file02" /> <br /> <input name="up" type="submit" value="上传" /> </form> </body> FileUploadServlet.java import java.io.File; import java.io.IOException; import java.io.PrintWriter; 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.FileUploadException; import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final long MAX_SIZE = 300 * 1024 * 1024;// 设置上传文件最大值 // 允许上传的文件格式的列表 final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt", "doc", "mp3", "wma", "m4a", "rar", "zip" }; response.setContentType("text/html"); // 设置字符编码为UTF-8, 统一编码,处理出现乱码问题 response.setCharacterEncoding("UTF-8"); // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload DiskFileItemFactory dfif = new DiskFileItemFactory(); dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘 dfif.setRepository(new File(request.getRealPath("/") + "ImagesUploadTemp"));// 设置存放临时文件的目录,web根目录下的ImagesUploadTemp目录 // 用以上工厂实例化上传组件 ServletFileUpload sfu = new ServletFileUpload(dfif); // 设置最大上传大小 sfu.setSizeMax(MAX_SIZE); PrintWriter out = response.getWriter(); // 从request得到所有上传域的列表 List fileList = null; try { fileList = sfu.parseRequest(request); } catch (FileUploadException e) {// 处理文件尺寸过大异常 if (e instanceof SizeLimitExceededException) { out.println("文件尺寸超过规定大小:" + MAX_SIZE + "字节<p />"); out .println("<a href=\"upload2.jsp\" target=\"_top\">返回</a>"); return; } e.printStackTrace(); } // 没有文件上传 if (fileList == null || fileList.size() == 0) { out.println("请选择上传文件<p />"); out.println("<a href=\"upload2.jsp\" target=\"_top\">返回</a>"); return; } // 得到所有上传的文件 Iterator fileItr = fileList.iterator(); // 循环处理所有文件 while (fileItr.hasNext()) { FileItem fileItem = null; String path = null; long size = 0; // 得到当前文件 fileItem = (FileItem) fileItr.next(); // 忽略简单form字段而不是上传域的文件域(<input type="text" />等) if (fileItem == null || fileItem.isFormField()) { continue; } // 得到文件的完整路径 path = fileItem.getName(); // 得到文件的大小 size = fileItem.getSize(); if ("".equals(path) || size == 0) { out.println("请选择上传文件<p />"); out .println("<a href=\"upload2.jsp\" target=\"_top\">返回</a>"); return; } // 得到去除路径的文件名 String t_name = path.substring(path.lastIndexOf("\\") + 1); System.out.println(t_name); // 得到文件的扩展名(无扩展名时将得到全名) String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1); // 拒绝接受规定文件格式之外的文件类型 int allowFlag = 0; int allowedExtCount = allowedExt.length; for (; allowFlag < allowedExtCount; allowFlag++) { if (allowedExt[allowFlag].equals(t_ext)) break; } if (allowFlag == allowedExtCount) { out.println("请上传以下类型的文件<p />"); for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++) out.println("*." + allowedExt[allowFlag] + " "); out .println("<p /><a href=\"upload2.jsp\" target=\"_top\">返回</a>"); return; } long now = System.currentTimeMillis(); // 根据系统时间生成上传后保存的文件名 String prefix = String.valueOf(now); // 保存的最终文件完整路径,保存在web根目录下的ImagesUploaded目录下 String u_name = request.getRealPath("/") + "ImagesUploaded/" + prefix + "." + t_ext; //String filename = prefix + "." + t_ext; //根据原文件名保存文件 String filename=t_name; try { // 保存文件到C:\\upload目录下 fileItem.write(new File("D:\\upload\\" + filename)); System.out.println(filename); out.println("文件上传成功. 已保存为: " + t_name + " 文件大小: " + size + "字节<p />"); out .println("<a href=\"upload2.jsp\" target=\"_top\">继续上传</a>"); } catch (Exception e) { e.printStackTrace(); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } } </html>
要在JSP实现上传本地文件,可以使用HTML的form标签和input标签来实现。以下是一个简单的示例: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>上传文件</title> </head> <body> <form action="upload.jsp" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </form> </body> </html> ``` 在这个例子,我们使用了form标签和input标签来创建一个表单,其input标签的type属性设置为file,表示可以选择本地文件进行上传。form标签的action属性指定了处理上传请求的JSP页面,而enctype属性设置为multipart/form-data,表示表单数据包含文件上传的二进制数据。 在JSP页面,我们可以使用request对象的getPart()方法来获取上传的文件内容,然后进行保存或其他处理。以下是一个简单的upload.jsp页面的示例代码: ```jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.io.*, javax.servlet.http.*, javax.servlet.*" %> <html> <head> <title>上传文件</title> </head> <body> <% Part filePart = request.getPart("file"); String fileName = filePart.getSubmittedFileName(); InputStream fileContent = filePart.getInputStream(); // 进行文件处理或保存 %> <p>文件上传成功!</p> </body> </html> ``` 在这个例子,我们使用了request对象的getPart()方法来获取上传的文件内容,然后使用InputStream读取文件的二进制数据。可以根据具体需求对文件进行处理或保存,最后输出一个提示消息表示上传成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值