文件上传的原始实现

来源:互联网 发布:mac是什么牌子化妆品 编辑:程序博客网 时间:2024/05/09 02:43

第一步:显示页面

<body>

 上传下载<br/>

 <form action="<c:url value='UploadServlet'/>"

                       method="post"

                       enctype="multipart/form-data">

    File:<input type="file" name="txt"><br/>

    desc:<input type="text"name="dsc"><br/>

    <input type="submit" value="上传">

 </form>

</body>

 

第二步:开发UploadServlet

package czb.servlet;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class UploadServlet extends HttpServlet {

 

    public void doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException,IOException {

        // 设置编码

        request.setCharacterEncoding("UTF-8");

        // 获取值

        String name = request.getParameter("dsc");// 设置了enctype="multipart/form-data"后,getParameter获取不到数据

        System.err.println("获取的值是:" + name);

        // 获取项目发布后的真实路径

        String path = request.getServletContext().getRealPath("/up");

        System.err.println("path is>>>>>:" + path);

 

        // 通过io获取值

        InputStream in = request.getInputStream();

        BufferedReader br = newBufferedReader(newInputStreamReader(in, "GBK"));

        // 读取的前四行不要,但第一行作为结束的标志

        String split = br.readLine();

        String ds = br.readLine();// Content-Disposition

        String fileName = ds.substring(ds.lastIndexOf("=") + 1);

        fileName= fileName.replace("\"", "");// f:\aa.txt

        fileName= fileName.substring(fileName.lastIndexOf("\\") + 1);

        System.err.println("filename is :"+ fileName);

        br.readLine();

        br.readLine();

        // 声明保存路径

        PrintWriter pw = newPrintWriter(path + "/" + fileName);

        // 以下读取正文

        String line = null;

        while ((line = br.readLine())!= null){

            if (line.contains(split)){

                break;

            }

            pw.println(line);

        }

        pw.close();

    }

 

}

 

分析上传时的HTTP请求类型:

POST/05124/UploadServlet HTTP/1.1[微软用户1] 

Accept:image/gif, image/x-xbitmap, l, */*[微软用户2] 

Referer:http://localhost:8080/05124/

Accept-Language:zh-cn

Content-Type:multipart/form-data;[微软用户3] boundary=---------------------------7dd5d91e015a[微软用户4] 

Accept-Encoding:gzip, deflate

User-Agent:Mozilla/4.0 (compatible; ..)

Host:localhost:8080

Content-Length:377

Connection:Keep-Alive

Cache-Control:no-cache

Cookie:JSESSIONID=64E34ABD84E1A8D08DE8E70817F5A515

 

-----------------------------7dd5d91e015a[微软用户5] 

Content-Disposition:form-data; name="txt"; filename="D:\sn.txt"

Content-Type:text/plain

 

SQLyogUltimate v8.32

 

Name: Any

Registration Code: 26f359fc-e3f6-4727-8af1-72a1a4a0819d

[微软用户6] 

-----------------------------7dd5d91e015a[微软用户7] 

Content-Disposition:form-data; name="dsc"

 

澶ф瀹?

-----------------------------7dd5d91e015a--[微软用户8] 


请求首行

以下都是请求头。

就是用户设置的enctype

数据分隔符号。随机。

说明文件的数据开始了。

正文部分。

又是一个文件。

结束后面的多两个小小线。