java文件上传-原始的Servlet方式

前言:

干了这几个项目,也做过几次文件上传下载,要么是copy项目以前的代码,要么是百度的,虽然做出来了,但学习一下原理弄透彻还是很有必要的。刚出去转了一圈看周围有没有租房的,在北京出去找房子是心里感觉最不爽的时候,没有归属感,房租还不便宜,RT,不能好高骛远,还是脚踏实地一点一点学技术吧,终将有一日,工资会涨的。

java文件上传

传统的文件上传,不用jquery插件的话,就是用form表单提交,项目里用过uploadify,可以异步上传文件,原理我也没研究。现在说传统的form表单上传文件。

文件上传核心:

  1. 用<input type=”file”/> 来声明一个文件域。样式如  文件:_____ <浏览>.
  2. 必须使用post方式提交表单。
  3. 必须设置表单的类型为multipart/form-data.是设置这个表单传递的不是key=value值。传递的是字节码.

新建web项目:

jsp form表单:enctype(编码类型)的默认值就是 application/x-www-form-urlencoded

浏览器查看 http报文:

主要参数:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8    接收服务器返回的类型,*/*表示所有。

Referer:http://localhost:8888/upload/    来自哪个网站

Accept-Language:zh-CN,zh;q=0.8 :请求回应中首选的语言为简体中文

Accept-Encoding:gzip, deflate, br支持的压缩格式

User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36   用户浏览器类型

Host:localhost:8888 主机地址

Connection:keep-alive 报文发送完毕后仍然保持连接

Cache-Control: max-age=0  缓存

Content-Length: 41 41字节

对文件上传来说,重要的参数是:

Content-Type: application/x-www-form-urlencoded

这个参数只有post请求才有,默认就是application/x-www-from-urlencoded ,Content-type表示正文类型,get方式没有正文,因为参数在url里。

在Servlet里可以用request对象取到Content-type:request.getHeader("Content-type"); 默认的值为 application/x-www-form-urlencoded,

如果是get请求,则 request.getHeader("Content-type");为null。

下图是get请求时的http头信息:

 



文件上传,必须设置enctype="multipart/form-data"

from表单:

上传一个word:

此时的http消息: Content-Type:multipart/form-data; boundary=----WebKitFormBou ndarywYwQ3v1NemO0bPfM 。

其中的 boundary=----WebKitFormBoundary44gVxAkoSg3tk3oR 指的是文件上传的分隔符。

看请求的报文: boundry=xxxxx 标识文件开始,也有文件头,说的是上传的数据的类型,第一个input 是text类型,第二个是二进制,content-type 是application/octet-stream 表示 二进制流。上传图片,Content-Type: image/jpeg,上传文本,Content-Type: text/plain。

二进制流的接收:

当表单类型是post类型,切enctype="multipart/form-data",则所有的数据都是以二进制流的形式向服务器上传,所以request.getParameter("xxx") 永远为null,只能通过req.getInputStream(); 获取正文。

上传一个txt:

Servlet:

package com.lhy.upload;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Administrator
 *
 */
@WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")
public class UploadServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
//        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");
        String contentType = req.getHeader("Content-type");
        System.out.println("contentType:  "+contentType);
        String name = req.getParameter("name");
        System.out.println(name);//null

        InputStream is = req.getInputStream();

//        ------WebKitFormBoundaryG0ULv7eVfQ1K2PBA
//        Content-Disposition: form-data; name="image"; filename="静夜思.txt"
//        Content-Type: text/plain
//
//
//        ------WebKitFormBoundaryG0ULv7eVfQ1K2PBA--
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String firstLine = br.readLine();//第一行,分隔符
        String fileName = br.readLine();
//        Content-Disposition: form-data; name="image"; filename="jingyesi.txt"
        fileName = fileName.substring(fileName.lastIndexOf("=")+2,fileName.length()-1);

        br.readLine();
        br.readLine();
        String data = null;
        //获取当前项目的运行路径
        String path = getServletContext().getRealPath("/up");
        PrintWriter pw = new PrintWriter(path+"/"+fileName);
        while((data = br.readLine()) != null){
            if(data.equals(firstLine+"--")){
                break ; //读到了文件尾
            }
            pw.println(data);
        }
        pw.flush();
        pw.close();
        is.close();

       /* FileOutputStream  fos = new FileOutputStream(path+"/"+"b.doc");
//        byte[] b = new byte[1024];
        int len = 0;
        while((len = is.read()) != -1){
            fos.write(len);
        }
        fos.flush();
        fos.close();
        is.close();*/
    }

}

项目里:

例子只是读取了txt,其他的二进制需要使用inputStream读取。

时间: 2024-10-24 10:37:39

java文件上传-原始的Servlet方式的相关文章

Java文件上传的几种方式

文件上传与文件上传一样重要.在Java中,要实现文件上传,可以有两种方式: 1.通过Servlet类上传 2.通过Struts框架实现上传 这两种方式的根本还是通过Servlet进行IO流的操作. 一.通过Servlet类上传 1.编写Sevlet类 package com.chanshuyi.upload; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.

文件上传的三种方式-Java

前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对 Http 协议较模糊,故这次采用渐进的方式来学习文件上传的原理与实践.该博客重在实践. 一.Http协议原理简介 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HT

Java 文件上传 MultipartFile与ServletFileUpload

参考这个:https://www.cnblogs.com/liuyangv/p/8298997.html Java文件上传 MultipartFile 1. 配置MultipartResolver defaultEncoding="UTF-8"               是请求的编码格式,默认为iso-8859-1maxUploadSize="1048576"            是上传文件的大小,单位为字节uploadTempDir="fileUpl

java文件上传和下载

简介 文件上传和下载是java web中常见的操作,文件上传主要是将文件通过IO流传放到服务器的某一个特定的文件夹下,而文件下载则是与文件上传相反,将文件从服务器的特定的文件夹下的文件通过IO流下载到本地. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的j

java文件上传下载

文件上传首先要引入两个核心包 commons-fileupload-1.2.1.jar commons-io-1.4.jar 下面是对文件上传和下载的一些代码做的一个简单封装,可以方便以后直接使用[使用时将封装好的jar包直接导入工程中即可使用] 上传文件核心代码 1 package com.lizhou.fileload; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOExcepti

SpringMVC文件上传的两种方式

搞JavaWEB的应该或多或少都做过文件上传,之前也做过简单的上传,但是如下的需求也确实把我为难了一把: 1.上传需要异步, 2.需要把上传后文件的地址返回来, 3.需要进度条显示上传进度. 项目使用SpringMVC架构+easyUI,初步分析,进度条可以使用easyui自带的进度条,上传可以使用ajaxFileUpload或者ajaxForm.文件传上去,然后把路径带回来是没问题的,关键是上传进度怎么获取.最终,两种方式都实现啦. 首先,不管哪种方式,后台对文件处理都是必须的.文件处理: 1

java 文件上传

java 上传文件 如果不依赖框架的话 要利用 Apache 中几个jar文件来处理 1.  给表单设置enctype属性,其值为 "multipart/form-data",另外,提交方式必须是post. 2.     在服务器端,不能够直接使用request.getParameter方法来获得数据. 只能使用InputStream request.getInputStream();通过分析这个字节流来获得数据.一般通过一些工具来分析. 3.要利用 Apache 中几个jar文件来处

java 文件上传下载--基于ajaxFileUpload+struts2

jQuery插件ajaxFileUpload可以实现ajax文件上传,使用非常简单. 下面做一个简单的demo(以上传图片为例),实现图片上传,图片显示,图片下载 注:以下的代码是在项目的基础上进行开发.css样式文件.包路径等未做修改. 1. ajaxFileUpload文件下载地址http://www.phpletter.com/Demo/AjaxFileUpload-Demo/ 2.自行引入jquery.js.ajaxFileUpload.js文件 jsp核心代码: [html] view

java文件上传模块

今天做了一下java的简单的文件上传,使用的是commons-fileupload-1.3.1.jar.依赖于commons-io-2.4.jar.所以在导入包的时候也需要导入这个commons-io-2.4.jar.至于版本之间的关系,我并没有好好的去看,我使用的这两个还是很很友好合作的. 使用这两个包来上传文件到服务器端,是比较简单的.大致的就分为两个部分,一个是html页面部分的设置,一个是servlet部分的代码. html页面 1 <form action="uploadFile