javaweb中运用fileupload上传文件

2023-11-30 16:18:59 浏览数 (1)

前言

在 Java Web 应用中,使用 Apache Commons FileUpload 库可以方便地处理文件上传。本文也是介绍Java Web 开发运用Apache中的commons fileupload的commons io的工具来进行文件上传,在开发中会遇到很多比较棘手的问题,本人接触后进行了总结。

开发准备

去阿帕奇官网https://commons.apache.org/下载commons fileupload的commons io的连接bin.jar包,里面有很多commons工具组件,以后开发都会用到。找到fileupload跟io,点击去选择版本下载,这里要说明一下。

只要下载红色框中一对压缩包就行,其中src是源文件。

前台开发

代码语言:txt复制
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- enctype默认字符类型是:application/x-www-form-urlencoded
	这种无法读取文本内容,enctype="multipart/form-data这中才可以,以二进制读取文件
	改为这种方式不可以用getParameter方式获取参数
 -->
	<form action="uploadServlet" method="post" enctype="multipart/form-data">
		上传文件<input type="file" name="file">
		<br><br>
		desc:<input type="text" name="desc">
		<input type="submit" value="Submit">
	</form>
</body>
</html>

后台开发

UploadServlet:这里复制index例子后,按Ctrl shilt o,导入commons的包,一定是要导入正确的包,因为在本地Tomcat中也有相关的包,以免导入后无法上传

代码语言:txt复制
package com.qiming.javaweb;



import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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;


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

		//以下是在commons-fileupload-1.2.1site的例子
		//注意在新的压缩包中没有这个index.html
		//复制commons.fileupload的例子源码
		// 1.得到FileItem的items
		DiskFileItemFactory factory = new DiskFileItemFactory();
		// Set factory constraints
		factory.setSizeThreshold(1024*500);
		//创建临时文件
		File tempDirectory=new File("D:\tempDirectory");
		factory.setRepository(tempDirectory);
		// Create a new file upload handler
		ServletFileUpload upload = new ServletFileUpload(factory);
		
		
		// Set overall request size constraint
		upload.setSizeMax(1024*1024*5);

		// Parse the request
		try {
			//对于表单的类型multipart/form-data,获取表单内容
			List<FileItem> items = upload.parseRequest(request);
			
			for(FileItem item:items){
				if(item.isFormField()){
					//获取请求的文件名getFieldName
					//如果是一个一般的表单域,打印信息
					String name=item.getFieldName();
					String value=item.getString();
						
					System.out.println(name ":" value);
				}
				//若是文件域则把文件保存到d:\files目录下
				else{
					//获取jsp请求的file名字
					String fieldName = item.getFieldName();
					//获取上传文件的全路径,必须分割找到文件名
				    String fileName = item.getName();
				    String contentType = item.getContentType();
				    long sizeInBytes = item.getSize();
				    
				    System.out.println(fieldName);
			
				    System.out.println(fileName);
				    System.out.println(contentType);
				    System.out.println(sizeInBytes);
				    
				    InputStream in=item.getInputStream();
				    byte[] buffer=new byte[1024];
				    int len=0;
				    //获取文件名
				    String filename1 = FileUploadUtils.getRealName(fileName);
				    //创建文件路径
				    fileName="d:\files\" filename1;
				    System.out.println(fileName);
				    //输出到电脑
				    OutputStream out=new FileOutputStream(fileName);
				    while((len=in.read(buffer))!=-1){
				    	out.write(buffer, 0, len);
				    }
				    out.close();
				    in.close();
				    }
			}
			
		
		
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		
		
		
		
		
		
		//1.获取请求信息,获取的请求信息不是二进制的,不能读取文件,必须使用io流
//	String file=request.getParameter("file");
//	String desc=request.getParameter("desc");
//	
//	System.out.println(file);
//	System.out.println(desc);
//	
		
	//io流读取内容,但是通过流获取很麻烦
//	InputStream in=request.getInputStream();
//	
//	Reader reader=new InputStreamReader(in);
//	BufferedReader bufferedReader=new BufferedReader(reader);
//	
//	String str=null;
//	
//	while((str=bufferedReader.readLine())!=null){
//		System.out.println(str);
//	}
	}

}

这个类很重要,因为commons fileupload中的getName在不同浏览器获取的结果是不同的,有的会获取全路径,有的只会获取文件名,所以为了统一,定义这个类是对获取的要上传的文件的全路径得到要上传的文件名,然后在将文件名与制定要下载的目录拼接起来。

路径拼接运用:String中的lastIndexOf("") 1方法,必须写“”,其中一个"/"是转义字符,获取文件路径后,从最后一个“/”开始获取文件名,比如:d:files2NE1 - Kiss.mp3,获取之后是2NE1 - Kiss.mp3。源代:

代码语言:txt复制
import java.util.UUID;

public class FileUploadUtils {
    //获取文件的名称。
    public static String getRealName(String filename){
    	//从最后一个“”返回,开始获取字符串,获取文件名
        int index = filename.lastIndexOf("\") 1;
        return filename.substring(index);
    }

这样就可解决文件上传,路径问题了。代码仅供参考,有什么错误,请指教。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞