Java学习日记6:文件上传

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

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;
    }

}

今天就先到这吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值