JAVA文件上传

今天复习下文件上传功能

所需组件:

commons-fileupload-1.2.1.jar  

commons-io-1.4.jar

上传页面 sc.jsp

<span style="font-size:18px;"><%@ 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>文件上传</title>
</head>
<body>

<form action="${ pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data">
	文件描述:<input type="text" name="desc"/><br/>
	文件上传:<input type="file" name="upload"><br/>
	<input type="submit" value="上传">
</form>

</body>
</html></span>

上传servlet

<span style="font-size:18px;">package com.anditech.fileupload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Properties;
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("/upload")
public class Upload extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Upload() {
        super();
    }
    
	/**
	 * 1.创建一个磁盘文件项工厂.
	 * 2.创建一个核心解析类ServletFileUpload.
	 * 3.解析request对象.返回一个List<FileItem>
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1.创建一个磁盘文件项工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setSizeThreshold(3*1024*1024);// 设置缓冲区是3M。
		String tempPath = getServletContext().getRealPath("/temp");
		File file = new File(tempPath);
		factory.setRepository(file);
		
		//获取分隔符
		Properties props = System.getProperties();  
		String separator = props.getProperty("file.separator");
		
		//获取文件上传路径
		String basePath=this.getServletConfig().getServletContext().getRealPath("/");
		String dateStr = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
		String uploadPath = "uploadfile" +separator+"" + dateStr + ""+separator;
		String fullPath = basePath+uploadPath;
		
		System.out.println("filePath : "+fullPath);
		
		// 2.创建一个核心解析类.
		ServletFileUpload fileUpload = new ServletFileUpload(factory);
		 
		// 解决中文文件名乱码问题:
		fileUpload.setHeaderEncoding("UTF-8");
		
		// 3.解析request对象
		try {
			List<FileItem>  list = fileUpload.parseRequest(request);
			System.out.println();
			// 遍历
			for (FileItem fileItem : list) {
				if(fileItem.isFormField()){
					// 页面中的普通项
					// 获得的是普通项的名称
					String name = fileItem.getFieldName();
					// 获得普通项的值
					String value = fileItem.getString("UTF-8");
					System.out.println(name+"   "+value);
				}else{
					// 文件上传项
					// 获得文件的名称
					String fileName = fileItem.getName();
					
					int idx = fileName.lastIndexOf("\\");
					if(idx != -1){
						// 说明老版本浏览器.
						fileName = fileName.substring(idx+1);
					}
					System.out.println(fileName);
					// 获得文件的数据
					InputStream is = fileItem.getInputStream();
					// 向服务器端写文件.
					// 获得上传文件的路径.---获得文件上传的磁盘绝对路径
					File f=new File(fullPath);
					f.mkdirs();
					File file2 = new File(fullPath, fileName);
					if(!file.exists()){
						file.mkdirs();//如果file不存在自动创建
					}
					OutputStream os = new FileOutputStream(file2);
					// 两个流对接:
					int len = 0;
					byte[] b = new byte[1024];
					while((len = is.read(b))!=-1){
						os.write(b, 0, len);
					}
					is.close();
					os.close();
				}
				// 删除临时文件.
				fileItem.delete();
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
	}

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

}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值