JavaWeb实现文件上传下载

1.创建web项目

2. 上传文件页面

必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据

必须把form的enctype属值设为multipart/form-data.设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,

并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<!-- 实现文件的上传 -->
<!-- 1.要上传文件 表单提交请求的方式必须为post请求 -->
<!-- 2.要上传文件 需要设置form表单的enctype
	application/x-www-form-urlencoded是form表单enctype的默认值
	需要将enctype的值设置为 multipart/form-data
-->
<form action="/UploadServlet" enctype="multipart/form-data" method="post">
    上传用户:<input type="text" name="username"><br/>
    上传文件:<input type="file" name="file1"><br/>
    上传文件:<input type="file" name="file2"><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

3.

使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io。

将jar包放置lib文件夹下后,还需配置他的位置信息

4.上传文件Servlet

DiskFileItemFactory 是创建 FileItem 对象的工厂

ServletFileUpload 负责处理上传的文件数据,并将表单中每个输入项封装成一个 FileItem 对象中

FileItem类负责处理表单提交的字段

上传文件步骤:

 

  1. 创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录;
  2. 使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制;
  3. 调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象;
  4. 对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件;如果是上传文件,则写出上传数据。
package com.study;

import java.io.File;
import java.io.IOException;
import java.util.Date;
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.FileUploadException;
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;
    public UploadServlet() {
        super();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获得一个文件上传的工厂类
        DiskFileItemFactory dfif = new DiskFileItemFactory();//DiskFileItemFactory 是创建 FileItem 对象的工厂
        //设置文件上传临时存储的大小8M
        dfif.setSizeThreshold(1024*1024*8);
        //指定临时文件目录,默认值为当前用户的系统临时文件目录,可通过System.getProperty(“java.io.tmpdir”)打印查看;
        dfif.setRepository(new File("java.io.tmpdir"));
        System.out.println(System.getProperty("java.io.tmpdir"));
        //使用servlet来处理文件上传
        ServletFileUpload upload = new ServletFileUpload(dfif);
        //设置文件上传的大小
        upload.setSizeMax(1024*1024*50);
        //获得当前服务器的路径
        String uploadPath = this.getServletContext().getRealPath("");
        System.out.println("当前服务器路径---->"+uploadPath);
        uploadPath = uploadPath+"..\\"+"upload";
        File uploadDir = new File(uploadPath);
        if(!uploadDir.exists()){
            uploadDir.mkdir();
        }
        try {
            List<FileItem> formItem = upload.parseRequest(request);
            if(formItem != null && formItem.size() >0){
                //循环遍历要上传的文件
                for(FileItem item : formItem){
                    if(!item.isFormField()){
			//获得要上传的文件的名字
                        String fileName = new File(item.getName()).getName();
                        //fileName = new Date().getTime()+(int)(Math.random()*100)+fileName;

                        //目的文件
                        String filePath = uploadPath+"\\"+fileName;
                        File storeFile = new File(filePath);
                        item.write(storeFile);

                        System.out.println(fileName);
                        System.out.println(filePath);
                        //request.setAttribute("fileName", fileName);
                    }
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
            request.setAttribute("message", "文件上传失败:"+e.getMessage());
            request.getRequestDispatcher("error.jsp").forward(request, response);
        } catch (Exception e) {
            e.printStackTrace();
        }
        request.getRequestDispatcher("upload.jsp").forward(request, response);
    }

}

 5.下载文件页面

<body>
<!-- 实现文件下载 需要跳转至servlet 用流来处理 -->
<a href="/DownLoadServlet"><h3>下载</h3></a>
</body>

6.下载文件Servlet

服务器希望浏览器不直接处理相应的实体内容,而是由用户选择将相应的实体内容保存到一个文件

这需要设置 Content-Disposition 响应头。

先使用文件输入流 将文件读到内存中 再使用输出流 将文件输出给用户

package com.study;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

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("/DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public DownLoadServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request,response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//实现文件下载 设置响应头
		String fileName = this.getServletContext().getRealPath("")+"../"+"upload/"+"zly.jpg";
		response.setHeader("Content-Disposition", "attachment;filename="+fileName);
		System .out.print("fileName"+fileName);
		//先使用文件输入流 将文件读到内存中 再使用输出流 将文件输出给用户
		File file = new File(fileName);
		FileInputStream fileIn = new FileInputStream(file);
		//准备一个缓冲区
		byte[] b = new byte[(int)file.length()];
		//将文件读入缓冲区中
		fileIn.read(b);
		//获得响应的输出流
		ServletOutputStream sout = response.getOutputStream();
//调用response.getOutputStream()方法返回 ServeltOutputStream 对象来向客户端写入文件内容。
		sout.write(b);
		sout.close();
	}
}

 

文件上传下载是Web应用程序中常见的功能之一,下面给出一个简单的JavaWeb实现: 1. 文件上传 在JSP页面中,需要一个表单,用于选择文件并提交: ```html <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> ``` 在Servlet中,处理文件上传的代码如下: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上传的文件 Part filePart = request.getPart("file"); String fileName = getFileName(filePart); // 保存上传的文件 OutputStream out = new FileOutputStream(new File("D:/uploads/" + fileName)); InputStream in = filePart.getInputStream(); byte[] buffer = new byte[1024]; int length = -1; while ((length = in.read(buffer)) != -1) { out.write(buffer, 0, length); } in.close(); out.close(); // 返回上传成功的信息 response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); writer.println("上传成功!"); } // 获取上传的文件名 private String getFileName(Part part) { String contentDisposition = part.getHeader("content-disposition"); String[] tokens = contentDisposition.split(";"); for (String token : tokens) { if (token.trim().startsWith("filename")) { return token.substring(token.indexOf("=") + 2, token.length() - 1); } } return ""; } ``` 2. 文件下载 在JSP页面中,需要一个超链接,用于触发文件下载: ```html <a href="download?fileName=test.txt">Download</a> ``` 在Servlet中,处理文件下载的代码如下: ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取要下载的文件名 String fileName = request.getParameter("fileName"); // 设置响应头,告诉浏览器下载文件 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"), "iso8859-1")); // 读取要下载的文件并写入响应流 InputStream in = new FileInputStream(new File("D:/uploads/" + fileName)); OutputStream out = response.getOutputStream(); byte[] buffer = new byte[1024]; int length = -1; while ((length = in.read(buffer)) != -1) { out.write(buffer, 0, length); } in.close(); out.close(); } ``` 以上就是JavaWeb实现文件上传下载的简单示例,需要注意的是上传的文件保存在服务器的硬盘上,因此需要确保上传的文件不会对服务器造成安全威胁,如上传病毒文件、木马等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值