Servlet 实现文件上传

使用Servlet原生API进行文件上传:

一、Upload.java(文件上传Servlet)

package servlet;

import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;

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

import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

import exception.UploadException;
import util.FileUtil;
/**
 * 文件上传Servlet
 * @author GengYB
 *
 */
public class Upload extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//判断是不是MultipartContent
		boolean isMC = ServletFileUpload.isMultipartContent(req);
		if(!isMC) 
			throw new UploadException("<form> no set \"method='post'\" or no set enctype='multipart/form-data' attribute!");
		Collection<Part> parts = req.getParts();//文件都被包装在这里
		for (Part part : parts) {
			String contentType = part.getContentType();//获取文件类型
			System.out.println(contentType);
			String name = part.getName(); //获取表单域name属性值
			System.out.println(name);
			String submittedFileName = part.getSubmittedFileName();//获取文件名
			System.out.println(submittedFileName);
			long size = part.getSize(); //获取文件大小
			System.out.println(size);
			InputStream inputStream = part.getInputStream();//获取输入流(文件内容就是从这里读取)
			System.out.println("-----------------");
			if(contentType!=null) {//文件part
				//处理文件
				//将文件保存在D:\\save目录下
				FileUtil.copyFile(inputStream, "D:\\save", submittedFileName);
			}else {//文本域
				//处理普通input域
				//自己去摸索吧
			}
		}
	}
}

      UploadException.java( 自定义异常)

public class UploadException extends RuntimeException {
	private static final long serialVersionUID = 1L;
	
	public UploadException() {
		super();
	}

	public UploadException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
	}

	public UploadException(String message, Throwable cause) {
		super(message, cause);
	}

	public UploadException(String message) {
		super(message);
	}

	public UploadException(Throwable cause) {
		super(cause);
	}
}

二、FileUtil.java (文件复制工具类)

package util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * @author GengYB
 * 文件复制工具类
 *
 */
public final class FileUtil {
	/**
	 * 从输入流复制数据到指定文件
	 * @param is 输入流
	 * @param savePath 保存路径
	 * @param saveFileName 保存的文件名
	 */
	public static void copyFile(InputStream is,String savePath,String saveFileName) {
		File sPath = new File(savePath);
		if(!sPath.exists()) {
			sPath.mkdirs();
		}
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(savePath+File.separator+saveFileName);
			copyFile(is, fos);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	/**
	 * @param is 输入流
	 * @param os 输出流
	 */
	public static void copyFile(InputStream is, OutputStream os){
		BufferedInputStream bis = new BufferedInputStream(is);
		byte[] b = new byte[512];
		int n;
		try {
			while((n = bis.read(b)) != -1) {
				os.write(b,0,n);
			}
		}catch(IOException e) {
			e.printStackTrace();
		}finally {
			try {
				os.close();
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
三、web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
        http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>upload</servlet-name>
		<servlet-class>servlet.Upload</servlet-class>
		<multipart-config> <!-- 这个必须配置,否则报异常! -->
			<max-file-size>52428800</max-file-size>
			<max-request-size>52428800</max-request-size>
			<file-size-threshold>0</file-size-threshold>
		</multipart-config>
	</servlet>
	<servlet-mapping>
		<servlet-name>upload</servlet-name>
		<url-pattern>/upload</url-pattern>
	</servlet-mapping>
</web-app>

     注意:

<multipart-config> <!-- 这个必须配置,否则报异常! -->

四、index.jsp(前端页面)
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Home</title>
</head>
<body>
	<form action="upload" method="post" enctype="multipart/form-data">
		<input type="file" name="file1" multiple="multiple"/>
		<input type="text" name="text1" />
		<input type="submit" value="提交" />
	</form>
</body>
</html>
     这里说一下,form的method属性必须设置为post,另外必须设置enctype="multipart/form-data".

五、演示

     选择文件,支持多文件得意,点击提交。

     查看D:\save

      




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue是一种用于构建用户界面的JavaScript框架,而Servlet是Java语言的服务器端技术。要实现Vue和Servlet的结合完成文件上传功能,需要以下步骤: 1. 首先,在Vue的组件中创建一个文件上传的表单,该表单包含一个文件选择框和一个提交按钮。 2. 当用户选择要上传的文件后,Vue将获取到文件对象,并以FormData的形式将文件数据和其他表单数据一起发送给服务器。 3. 在Vue中,可以使用axios或其他类似库向服务器发送HTTP请求。创建一个POST请求,将FormData对象作为请求的数据,并将请求发送到Servlet的URL。 4. 在Servlet中,创建一个POST方法的处理函数。在该处理函数中,获取到上传的文件和其他表单数据。可以使用HttpServletRequest的getPart方法来获取文件,使用getParameter方法来获取其他表单数据。 5. 使用文件的InputStream将上传的文件数据写入到服务器的指定位置。可以使用FileOutputStream将文件数据写入到磁盘上的指定文件夹中。 6. 处理完文件上传后,可以通过HttpServletResponse返回给前端一个上传成功的消息或者其他需要的数据。 在Vue和Servlet的结合实现文件上传功能时,需要注意跨域问题。可以在Servlet的响应中设置Access-Control-Allow-Origin头部信息,允许来自Vue前端的跨域请求。 以上是使用Vue和Servlet实现文件上传的基本步骤,根据具体的需求和情况可以进行相应的调整和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值