文件上传upload

一、html页面


二、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();
				}
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值