Java学习日记6:文件上传

来源:互联网 发布:淘宝店铺托管安全吗 编辑:程序博客网 时间:2024/06/03 11:49

今天学的是文件的上传(从客户端传到服务器)

Http文件上传客户端要求(在html中要注意的事情):
1、用表单提交数据

<from></form>

2、请求方法必须为post

<form method="post">

3、以二进制流提交数据给服务器(改变enctype的值)

<form enctype="multipart/form-data"  action="UploadFile" method=post >...</form>//enctype默认值为application/x-www-form-urlencoded,不会提交文件内容,只会提交文件名。enctype值设为multipart/form-data时,才能提交文件内容给服务器。

在服务器端:
Servlet3.0 文件上传支持:
HttpServletRequest增加了对文件上传的支持。
HttpServletRequest提供了如下两个方法来处理文件上传。
Part getPart(String name):根据名称来获取文件上传域。
Collection<Part> getParts():获取所有的文件上传域。
每个Part对象封装一个文件上传域,该对象提供了大量方法来访问上传文件的文件类型、大小、输入流等,并提供了一个write(String file)//这里的file是"(要写的文件所在的绝对路径)+(新文件名)"方法将上传文件写入服务器磁盘。

  • 注意:必须在接受上传Servlet上增加@MultipartConfig配置

这里有一个简单的实现文件上传的Servlet:
index页面:

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>文件上传</title></head><body><h1>文件上传</h1><center>  <form action="upload" enctype="multipart/form-data" method="post">     文件:<input type="file" name="pic"/><br/>   描述:<input type="text" name="dis"/><br/>   <input type="submit" value="Upload"/><br/>  </form></center></body></html>

Servlet:

package com.oracle;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.text.SimpleDateFormat;import java.util.Collection;import java.util.Date;import java.util.Iterator;import java.util.Random;import java.util.regex.Matcher;import java.util.regex.Pattern;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;import com.upload.UploadUtils;@MultipartConfig@WebServlet("/upload")public class UploadServlet01 extends HttpServlet{    @Override    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {    resp.setContentType("text/html;charset=utf-8");    PrintWriter out=resp.getWriter();    ServletContext sc=this.getServletContext();    Part part=req.getPart("pic");//根据表单项的名字得到Part对象    if(null!=part)    {        String contentType=part.getContentType();//得到文件类型        long size=part.getSize();//得到文件大小     Collection<String> allheader=  part.getHeaderNames();//得到所有报头名     Iterator<String> it=allheader.iterator();//迭代器     out.println("<h1>contentType:"+contentType+"</h1>");     out.println("<h1>size:"+size+"</h1>");     out.println("<h1>表单项的name:"+part.getName()+"</h1><ul>");     out.println("<h1>文件描述:"+req.getParameter("dis")+"</h1>");     while(it.hasNext())//迭代出所有报头和其所对应的值     {         String header=it.next();         String value=part.getHeader(header);         out.println("<li>"+header+":"+value+"</li>");     }     String newname=sc.getRealPath("ups")+File.separator+randFileName()+this.getExtName(this.getFileName(part));//新的路径+文件名     part.write(newname);//将文件写入服务器    // part.delete();        out.println("</ul>");     out.println("<h1>服务器数据表存:原文件名:"+this.getFileName(part)+"&nbsp;新文件名:"+newname+"&nbsp;MIME类型:"+part.getContentType()+"</h1>");    }  //  out.close();    }    private SimpleDateFormat sf=new SimpleDateFormat("yyyyMMddHHmmsssss");    private Random random=new Random();    public String randFileName()//根据时间写一个文件名,精确到毫秒,再加一个随机数    {        return sf.format(new Date())+"_"+random.nextInt(1000);    }    public String getExtName(String fname)//得到文件的扩展名(不包括原文件名)    {        String ex="";        int index=fname.lastIndexOf(".");        if(index!=-1)        {            ex=fname.substring(index);        }        return ex;    }    public String getFileName(Part part)//得到原文件名    {        String fname="";        String hvalue=part.getHeader("Content-Disposition");        //form-data; name="pic"; filename="hello.txt"        Pattern pattern=Pattern.compile("(form-data; name=\"(.*?)\"; filename=\"(.*?)\")");        Matcher mach=pattern.matcher(hvalue);        if(mach.find())        {            fname=mach.group(3);        }        return fname;    }}

今天就先到这吧~

0 0
原创粉丝点击