欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

文件上传upload

程序员文章站 2022-06-13 16:04:22
...

一、html页面

文件上传upload
二、servlet处理

package com.lyd.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Iterator;

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

public class UploadServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设置编码的格式
		resp.setContentType("text/html;charset=UTF-8");
		//获取页面传进来的参数
		/*String name = req.getParameter("name");
		String age = req.getParameter("age");
		String file = req.getParameter("file");
		//设置了编码过滤器则可以不要下面的设置
		//注意此处
		//name=new String(name.getBytes("ISO8859-1"),"UTF-8");
		//file=new String(file.getBytes("ISO8859-1"),"UTF-8");
		
		resp.getWriter().println("name:"+name+"<br>age:"+age+"<br>file:"+file);
		
		*/
		//文件的上传与下载,都会以流的形式进行,所以需要写一个方法进行流的处理
		//proStream(req,resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//设置编码的格式
		req.setCharacterEncoding("UTF-8");
		//只能在请求中调用
		proStream(req,resp);
	}

	//采用apach组建获取文件方法
	private void proStream(HttpServletRequest req, HttpServletResponse resp) throws IOException, IllegalStateException, ServletException {
		//设置响应对象的编码
		resp.setContentType("text/html;charset=UTF-8");
		/*//创建流通道
		ServletInputStream is=req.getInputStream();
		//定义一个字节数组
		byte[] arr=new byte[1024];
		//定义一个标签接收值
		int flag=0;
		//循环读取数据
		while((flag=is.readLine(arr, 0, 1024))!=-1) {
			//将读取的字节转换为字符串,通过字符串提供的构造方法(读取的字节数组,从0下标开始,读取的字节数为止)
			String line=new String(arr,0,flag);
			//通过响应对象读取的字符串显示在页面上
			resp.getWriter().write(line+"<br>");
		}
		//关闭流通到
		is.close();*/
		
		//第二种方法
		//获取参数
		String name = req.getParameter("name");
		String age = req.getParameter("age");
		//显示在页面上
		resp.getWriter().write("<strong>name:"+name+"<br>age:"+age+"</strong>");
		Part part = req.getPart("file");
//		String filename = part.getName();
//		resp.getWriter().write("<br/>filename:"+filename);
//		System.out.println(filename);
		
		//得到文件的名称,重新定义一个方法
		/*String fileName=getFileName(part);
		resp.getWriter().write("<br/>fileName:"+fileName+"<br/>");
		//获取文件的内容
		//创建流通道
		InputStream is=part.getInputStream();
		//定义一个字节数组
		byte[] arr=new byte[1024];
		//定义一个标签接收值
		int flag=0;
		//循环读取数据
		while((flag=is.read(arr, 0, 1024))!=-1) {
			//将读取的字节转换为字符串,通过字符串提供的构造方法(读取的字节数组,从0下标开始,读取的字节数为止)
			String line=new String(arr,0,flag);
			//通过响应对象读取的字符串显示在页面上
			resp.getWriter().write(line+"<br/>");
		}
		//关闭流通到
		is.close();*/
		
		//将上传的文件保存在服务器中
		//定义一个新的方法进行数据处理
		saveUpload(part);
		//做一个文件上传的提示
		resp.getWriter().write("<strong>文件上传成功</strong");
	}
	
	//定义一个方法用来获取文件的名称
	private String getFileName(Part part) {
		//测试部分,得到头的信息,从而获得文件名
//		Iterator<String> it = part.getHeaderNames().iterator();
//		while(it.hasNext()) {
//			String name = it.next();
//			//根据名字得到头的名称,是键值对的形式
//			System.out.println(name+":"+part.getHeader(name));
//		}
		
		//根据上面的测试,获取文件信息部分
		String header = part.getHeader("content-disposition");
		//分割和获取文件的信息
		String[] str=header.split("filename=");
		//把字符串数组转换为数组的字符串,用于显示的测试
		//System.out.println(Arrays.toString(str));
		//获取信息
		//System.out.println(str[str.length-1].replace("\"", ""));
		return str[str.length-1].replace("\"", "");
	}
	/**
	 * 获取上传文件的名称
	 * 获取应用程序的真实路径
	 * 创建文件夹进行数据的保存,此处需要判断
	 * @param part
	 */
	//保存文件在服务器的方法
	private void saveUpload(Part part) {
		//获取上传文件的名称
		String fileName = getFileName(part);
		//文件名相同,文件内容不同解决方法(定义不同的文件名)
		//System.nanoTime()系统的数,或者加一个uuid修饰
		fileName="lyd_"+System.nanoTime()+"_"+fileName;
		//获取应用程序的真实路径,用代码进行实现
		//首先获取Servlet上下文路径的对象
		ServletContext sc = getServletContext();
		String realPath = sc.getRealPath("File.separator");
		//String realPath = sc.getRealPath("/");
		System.out.println(realPath);
		//创建保存路径,保存路径在upload下面
		File file=new File(realPath+"upload");
		//如果文件不存在,需要提前进行创建
		if(!file.exists()) {
			//创建文件
			file.mkdirs();
		}
		//构建新的保存文件(文件路径,文件名)
		File upFile=new File(file,fileName);
		//得到文件的输入流
		InputStream fis=null;
		byte[] arr=new byte[1024];
		int flag=0;
		//得到文件的输出流
		FileOutputStream fos=null;
		try {
			fos=new FileOutputStream(upFile);
			fis=part.getInputStream();
			while((flag=fis.read(arr, 0, 1024))!=-1) {
				//将读取的字节写入指定的文件中
				fos.write(arr, 0, flag);
			}
		}catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}finally {
			//先关闭输出流
			if(fos!=null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			//再关闭输出流
			if(fis!=null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}