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

前言:

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

java文件上传

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

文件上传核心:

用 来声明一个文件域。样式如  文件:_____ .

必须使用post方式提交表单。

必须设置表单的类型为multipart/form-data.是设置这个表单传递的不是key=value值。传递的是字节码.

新建web项目:

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

5fa9524c04e0f01e371711bf6344bd5c.png

3597403bdbe4f618ca67d485eed6c6c9.png

浏览器查看 http报文:

ccf077f1bbd24afccbf229b34f261054.png

主要参数:

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头信息,参数再url传递,没有Content-type

731f2e5990c4e67e1f01e76c6b92fc00.png

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

from表单:

f4c8dbc8410ab8d61e2114e3543fa6e1.png

上传一个word:

aae6d32850bfa3dc3589deb008cdd363.png

此时的http消息的Content-Type:

9e3fdf0f99fdccdb1ec87853df499307.png

其中的 boundary=----WebKitFormBoundary44gVxAkoSg3tk3oR 指的是文件上传的分隔符。在请求正文里体现。

看请求的正文:

-----xxxxxxxxxx 标识文件开始,最后一行的 --------xxxxxxxxxxxx--(分隔符末尾多了2个--),标识文件结束。第一个input 是text类型,第二个是二进制,content-type 是application/octet-stream 表示 二进制流。如果选择的是图片,Content-Type: image/jpeg,文本则,Content-Type: text/plain。

e0784b3b7f2ceeb8acc4f5c32a55be0c.png

二进制流的接收:

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

上传一个txt:

9976d8f14bcd8fb2ddb8709724decf5c.png

Servlet:

packagecom.lhy.upload;importjava.io.BufferedReader;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.io.PrintWriter;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;/***

*@authorAdministrator

**/@WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")public class UploadServlet extendsHttpServlet{

@Overrideprotected voiddoGet(HttpServletRequest req, HttpServletResponse resp)throwsServletException, IOException {//this.doPost(req, resp);

}

@Overrideprotected voiddoPost(HttpServletRequest req, HttpServletResponse resp)throwsServletException, 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(newInputStreamReader(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();*/}

}

项目里:

9f245f3af77182ddb3d33a733baea5ec.png

bbb5bfdf9ff47801aec5dff81e7be34f.png

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

我读取了图片写到项目里,打不开,大小比原始图片会小一点,不知为何

欢迎关注个人公众号一起交流学习:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SharePoint 的企业信息平台架构

转载于:https://www.cnblogs.com/jackljf/p/3589224.html

java freemarker 分页_10小时入门java开发04 springboot+freemarker+bootstrap快速实现分页功能...

本节是建立在上节的基础上,上一节给大家讲了管理后台表格如何展示数据,但是当我们的数据比较多的时候我们就需要做分页处理了。这一节给大家讲解如何实现表格数据的分页显示。准备工作还是老规矩,看效果图可以看出我们实现了如下功能1&#x…

java $p_javap -c命令详解

一直在学习Java,碰到了很多问题,碰到了很多关于i和i的难题,以及最经典的String str "abc" 共创建了几个对象的疑难杂症。 知道有一日知道了java的反汇编 命令 javap。现将学习记录做一小结,以供自己以后翻看。如果有错误的地方&a…

hibernate 映射四多对一双向映射

学生和班级的例子来说,多个学生可以对应一个班级。 1.站在学生角度来说,学生就是多端。那么我们可以通过多对一来维护2者的关系。 2.站在班级的角度来说,班级就是一端。那么我们可以通过一对多啦维护2者的关系。 3.我们也可以双向关联两者的关…

django mysql 表单_Python Django 表单提交数据到mysql并展示

首先1: 新建项目userproject, 新建应用childName2: 这是childName文件目录,templates文件夹放insert.html 与 show.html3: insert.html 与 show.html/**insert.html**/用户登录12345678910111213141516Title信息展示用…

体验最火的敏捷——SCRUM(厦门,2014.1.4)

1.概述SCRUM是当前最火的一种敏捷开发方法,有用户故事、冲刺、燃尽图等很多很酷的玩法,有牛B的产品负责人、SCRUM Master,有超强的自组织团队。本沙龙将为您展现当前最火最酷的敏捷开发方法!内容大纲:1)SCRUM是神马东西…

[单选]物联网产业链的主要产品不包括下列哪一项 - 关于物联网(主讲:柳毅)笔记...

[单选]物联网产业链的主要产品不包括下列哪一项 转载于:https://www.cnblogs.com/scgw/p/3488452.html

java web读取excel_JavaWeb使用POI操作Excel文件实例

1.为项目添加POI点进去之后下载(上边的是编译好的类,下边的是源代码)解压文件夹,把下面三个文件复制到WebComtent>WEB-INF>lib文件夹下再把这三个文件复制到Tomcat的lib文件夹下,否则Tomcat会因为找不到类而报错(这个地方郁闷了一上午)…

java 静态方法与实例方法的区别_静态方法与实例方法的区分

Java系列之:看似简单的问题 静态方法和实例化方法的区别Java程序启动class文件被读取时类被加载,如果有static方法,此时会分配内存,非static方法实例化类时才在内存中分配控件存储,引用存储在堆栈中,实体存…

easyui源码翻译1.32--ValidateBox(验证框)

前言 使用$.fn.validatebox.defaults重写默认值对象。下载该插件翻译源码 validatebox(验证框)的设计目的是为了验证输入的表单字段是否有效。如果用户输入了无效的值,它将会更改输入框的背景颜色,并且显示警告图标和提示信息。该验证框可以结合form(表单…

学java前要学css_教你一招:学习Java必须学会的CSS用法

一:CSS概述什么是CSSCSS就是层叠样式表(Casading Style Sheets),通常称为CSS样式表,或者是级联样式表。主要用于设置HTML中的文本,内容(字体,大小,对齐),图片外形(宽高,边框样式&…

标准I/O库之缓冲

标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。 标准I/O提供了三种类型的缓冲: (1)全缓冲。这种情况下,在填满标…

java如何写安卓接口文档_android、java制作sdk以及自动生成文档

最近一直在做android开发,昨天经理让我写个接口SDK做个接口文档,以便后面的开发。这让我很焦灼,SDK怎么做?要是只有敲代码还好。可是那个接口文档!!!文档这东西最讨厌了,头都大了后来…

21世纪的设计模式:抽象工厂模式

这是我的演讲的第二部分,“ 21世纪的设计模式” 。 此模式在Java代码中到处都有使用,尤其是在更多“企业”代码库中。 它涉及一个接口和一个实现。 该界面如下所示: public interface Bakery {Pastry bakePastry(Topping topping);Cake bak…

java动态变量名反射_Java动态性—反射 - Eclipse666的个人空间 - OSCHINA - 中文开源技术交流社区...

1.什么是动态语言?程序运行时,可以改变程序的结构或者变量类型;如Python,javaScriptfunction(){var s"var a3;var b4;" evals(s);}在执行javascript代码的的过程中,可以改变变量的值或插入语句改变结构。但J…

mysql构建栋_【转载】这次拆库 应是微服务化的拆分方式

一、现状现状.png我们将一个大而全的系统一拆为三,容器,发布,测试都已经独立出去,但是原始的数据库还是一套,现在需要将数据库做一个拆分,A、B、C三个系统有各自的数据库之后,我们的微服务化在现…

使用SharePoint 2010新增的文档集内容类型来管理文档

使用SharePoint 2010新增的文档集内容类型来管理文档 SharePoint 2010新增加的文档集功能是作为内容类型存在的,使用范围在网站集中,需要激活“文档集”功能到网站集才可以正常使用。文档集其实就是一个SharePoint产品增强的文件夹和内容类型的综合体现。…

基于visual Studio2013解决算法导论之019栈实现(基于数组)

&#xfeff;&#xfeff;&#xfeff;题目用数组实现栈解决代码及点评#include <stdio.h> #include <stdlib.h> #include <time.h> #include <malloc.h> #include<assert.h>typedef struct Stack {int nTop;int nLen;int *pnArr; }Stack, *PSta…

关闭终端php就退出进程_解决windows下php-cgi进程经常自动关闭

php-cgi在linux中有fpm管理&#xff0c;Apache不是采用cgi这种模式&#xff0c;于是乎就出现了&#xff0c;在windows下&#xff0c;采用nginx时&#xff0c;开启的php-cgi监听非常不稳定&#xff0c;经常奔溃关闭。现在解决了这个问题。注意是win32位系统下解决的&#xff0c;…

php为什么获取不到id,微信小程序无法获取到unionId怎么办

UnionID机制说明如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序)&#xff0c;可通过unionid来区分用户的唯一性&#xff0c;因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序)&#xff0c;用户的unionid是唯一的。换句话说&#x…