Servlet处理文件上传

网页端:

<form method="post" action="upload"  enctype="multipart/form-data">
名称:<input type="text" name="name"><br/>
年龄:<input type="text" name="age"><br/>
上传:<input type="file" name="file"><br/>
<input type="reset" value="取消">
<input type="submit" value="提交">
</form>

Servlet:

package wodeschool.test;

import java.io.File;
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{

	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request,HttpServletResponse response)
	throws ServletException,IOException
	{
		request.setCharacterEncoding("UTF-8");//设置请求数据的编码方式
		process(request,response);//文件的处理
	}

	private void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		response.setContentType("text/html;charset=UTF-8");

		String name=request.getParameter("name");//获取普通数据name和age
		String age=request.getParameter("age");
		response.getWriter().write("<strong>name:"+name+"<br/>age:"+age+"</strong>"+"<br/>");
		Part part=request.getPart("file");//getPart()用于上传单文件,getParts()用于上传多个文件。

		saveUpload(part);//文件保存
		response.getWriter().write("<h3>文件上传成功</h3>");
	}

	private void saveUpload(Part part) {
		// TODO Auto-generated method stub
		String fileName=getFileName(part);//获取文件名
		fileName="school_"+System.nanoTime()+"_"+fileName;//防止文件重名
		
		ServletContext cxt=getServletContext();
		String realPath= cxt.getRealPath("/");//得到当前路径
		File file=new File(realPath+"upload");
		if(!file.exists()){
			file.mkdir();
		}
		File upFile=new File(file,fileName);
		FileOutputStream fos=null;
		InputStream is=null;
		byte[] buf=new byte[1024];
		int flag=-1;
		try {
			fos=new FileOutputStream(upFile);
			is=part.getInputStream();
			while((flag=is.read(buf,0,1024))!=-1)
			{
				fos.write(buf, 0, flag);
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch(IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			if(fos!=null){
				try {
					fos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(is!=null){
				try {
					is.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	private String getFileName(Part part) {

		String header= part.getHeader("content-disposition");
		String[] arr=header.split("filename=");
		

		return arr[arr.length-1].replace("\"", "");
	}

}

xml:也可以直接用注解的方式

<servlet>
  <servlet-name>Upload</servlet-name>
  <servlet-class>wodeschool.test.UploadServlet</servlet-class>
  <multipart-config>
  <max-file-size>1000000</max-file-size>
  <max-request-size>1001024</max-request-size>
  <file-size-threshold>4096</file-size-threshold>
   </multipart-config>
  </servlet>
  <servlet-mapping>
  <servlet-name>Upload</servlet-name>
  <url-pattern>/upload</url-pattern>
  </servlet-mapping>


一下为笔记部分:

envtype="multipart/form-data"是上传二进制数值的意思,如果删除它就是一个普通的表单,如果通过request.getParameter(String name)
获取值得话,获取的只是文件的名称。


//获取文件名称的方式:创建一个方法
private String getFileName(Part part){
    //通过文件头
    Interator<String> it=part.getHeaderNames().iterator;
    while(it.hasNext())//通过迭代器看文件头的内容
    {
        String name=it.mext();
        System.out.println(name+part.getHeader(name));
    }

//分割字符串:
String arr=header.split("filename=");//切割成数组
String fileName=arr[srr.length-1].replace("\"","");获取最后一个元素的值并去掉双引号。

return fileName;
}

 

转载于:https://my.oschina.net/wang520/blog/715365

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值