java boundary_上传文件multipart form-data boundary 说明

含义 ENCTYPE="multipart/form-data" 说明:

通过 http 协议上传文件 rfc1867协议概述,客户端发送内容构造。

概述

在最初的 http 协议中,没有上传文件方面的功能。 rfc1867为 http 协议添加了这个功能。客户端的浏览器,如 Microsoft IE, Mozila, Opera 等,按照此规范将用户指定的文件发送到服务器。服务器端的网页程序,如 php, asp, jsp 等,可以按照此规范,解析出用户发送来的文件。Microsoft IE, Mozila, Opera 已经支持此协议,在网页中使用一个特殊的 form 就可以发送文件。绝大部分 http server ,包括 tomcat ,已经支持此协议,可接受发送来的文件。各种网页程序,如 php, asp, jsp 中,对于上传文件已经做了很好的封装。

实例

注意 enctype="multipart/form-data", method=post, type="file" 。根据 rfc1867, 这三个属性是必须的。multipart/form-data 是新增的编码类型,以提高二进制文件的传输效率。

数据传输

11240502.html

格式 必须一字不差,包括最后的回车。

注意:Content-Length: 226 这里的226是红色内容的总长度(包括最后的回车)

注意这一行:

Content-Type: multipart/form-data; boundary=-----------------------------264141203718551

根据 rfc1867, multipart/form-data是必须的.---------------------------7d33a816d302b6 是分隔符,分隔多个文件、表单项。

其中7d33a816d302b6 是即时生成的字符串,用以确保整个分隔符不会在文件或表单项的内容中出现。

使用POST发送数据

以POST方式发送数据主要是为了向服务器发送较大量的客户端的数据,它不受URL的长度限制。POST请求将数据以URL编码的形式放在HTTP正文中,字段形式为fieldname=value,用&分隔每个字段。注意所有的字段都被作为字符串处理。实际上我们要做的就是模拟浏览器POST 一个表单。以下是IE发送一个登陆表单的POST请求:

48304ba5e6f9fe08f3fa1abda7d326ab.png

POST http://127.0.0.1/login.do HTTP/1.0

Accept: image/gif, image/jpeg, image/pjpeg, */*

Accept-Language: en-us,zh-cn;q=0.5

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

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

Content-Length: 28

username=admin&password=1234

48304ba5e6f9fe08f3fa1abda7d326ab.png

要在MIDP应用程序中模拟浏览器发送这个POST请求,首先设置HttpConnection的请求方式为POST(PHP为curl):

// 使用POST方法

httpURLConnection.setRequestMethod("POST");

然后构造出HTTP正文:

byte[] data = "username=admin&password=1234".getBytes();

并计算正文长度,填入Content-Type和Content-Length:

httpURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

httpURLConnection.setRequestProperty("Content-Length", String.valueOf(data.length));

然后打开OutputStream将正文写入:

OutputStream output = hc.openOutputStream();

output.write(data);

需要注意的是,数据仍需要以URL编码格式编码,由于MIDP库中没有J2SE中与之对应的URLEncoder类,因此,需要自己动手编写这个 encode()方法,可以参考java.net.URLEncoder.java的源码。剩下的便是读取服务器响应,代码与GET一致,这里就不再详述。

使用multipart/form-data发送文件

如果要在MIDP客户端向服务器上传文件,我们就必须模拟一个POST multipart/form-data类型的请求,Content-Type必须是multipart/form-data。

以multipart/form-data编码的POST请求格式与application/x-www-form-urlencoded完全不同,multipart/form-data需要首先在HTTP请求头设置一个分隔符,例如ABCD:

httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=ABCD");

然后,将每个字段用“--分隔符”分隔,最后一个“--分隔符--”表示结束。例如,要上传一个title字段"Today"和一个文件C:\1.txt,HTTP正文如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

--ABCD

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

\r\n

Today

--ABCD

Content-Disposition: form-data; name="1.txt"; filename="C:\1.txt"

Content-Type: text/plain

\r\n

--ABCD--

\r\n

48304ba5e6f9fe08f3fa1abda7d326ab.png

请注意,每一行都必须以\r\n结束,包括最后一行。如果用Sniffer程序检测IE发送的POST请求,可以发现IE的分隔符类似于 ---------------------------7d4a6d158c9,这是IE产生的一个随机数,目的是防止上传文件中出现分隔符导致服务器无法正确识别文件起始位置。我们可以写一个固定的分隔符,只要足够复杂即可。

发送文件的POST代码如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

String[] props = ... // 字段名

String[] values = ... // 字段值

byte[] file = ... // 文件内容

String BOUNDARY = "---------------------------7d4a6d158c9"; // 分隔符

StringBuffer sb = new StringBuffer();

// 发送每个字段:

for(int i=0; i

sb = sb.append("--");

sb = sb.append(BOUNDARY);

sb = sb.append("\r\n");

sb = sb.append("Content-Disposition: form-data; name=\""+ props[i] + "\"\r\n\r\n");

sb = sb.append(URLEncoder.encode(values[i]));

sb = sb.append("\r\n");

}

// 发送文件:

sb = sb.append("--");

sb = sb.append(BOUNDARY);

sb = sb.append("\r\n");

sb = sb.append("Content-Disposition: form-data; name=\"1\"; filename=\"1.txt\"\r\n");

sb = sb.append("Content-Type: application/octet-stream\r\n\r\n");

byte[] data = sb.toString().getBytes();

byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();

// 设置HTTP头:

hc.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY);

hc.setRequestProperty("Content-Length", String.valueOf(data.length + file.length + end_data.length));

// 输出:

output = hc.openOutputStream();

output.write(data);

output.write(file);

output.write(end_data);

// 读取服务器响应:

// TODO...

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

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

相关文章

java 预处理语句_预处理语句PreparedStatement到底咋用啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我自己试了一下直接查询id为1的语句,有一条结果出来,但是用了PreparedStatement后就没有结果了,有大佬知道为什么吗orzpackage test;import java.io.IOException;import java.io.PrintWriter;imp…

crud-table_我个人的CRUD故事-或我如何来到CUBA平台

crud-table在此博客文章中,我想介绍一下我如何使用CUBA平台以及该工具的好处。 在我年轻的“业务应用程序开发”历史上,我将深入探讨各个阶段,只是给您一些背景知识。 因此,让我们从如何进入典型的CRUD应用程序开始,以…

python api接口生成_Django 自动生成api接口文档教程

最近在写测试平台,需要实现一个节点服务器的api,正好在用django,准备使用djangorestframework插件实现。需求实现一个接口,在调用时,通过传递的参数,直接运行对应项目的自动化测试环境Python3.6 ,PyCharm,W7项目结构功…

eclipse clean_Clean Sheet – Windows 10的人体工程学Eclipse主题

eclipse cleanClean Sheet是适用于Windows 10的符合人体工程学的Eclipse主题。它基于干净,低眩光的外观和感觉,旨在减轻视觉疲劳和眼睛疲劳。 它融合了均衡的颜色选择,可以突出谐波语法并注重可读性。 除自定义滚动条外,它还努力满…

什么时候需要使用cqrs_在CQRS读取模型中使用Hibernate进行快速开发

什么时候需要使用cqrs在本文中,我将分享一些在CQRS读取模型中使用Hibernate工具进行快速开发的技巧。 为什么要Hibernate? Hibernate非常流行。 从外观上看,它也很容易,而从内部看,它却相当复杂。 它可以很容易地上手…

java面试题三_最全的java面试题目三

78、什么情况下调用doGet()和doPost()?答:Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。79、servlet的生命周期答:web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行…

python的内存管理机制及调优手段_Python的内存管理机制及调优手段

内存管理机制:引用计数、垃圾回收、内存池引用计数:引用计数是一种非常高效的内存管理手段,当一个Python对象引用时其引用计数加一,当其不再被一个变量引用时则减一。当引用计数等于0时对象被删除。1.引用计数:引用计数…

tcga癌症亚型获取_亚型多态性应用于元组的危险

tcga癌症亚型获取Java 8具有lambda和stream&#xff0c;但是没有元组&#xff0c;这真是令人遗憾 。 这就是为什么我们在jOOλ中实现了元组-Java 8的缺失部分 。 元组确实是无聊的值类型容器。 本质上&#xff0c;它们只是这些类型的枚举&#xff1a; public class Tuple2<…

java 隐藏了什么_JAVA程序中封装与隐藏是什么意思

qq_遁去的一_1隐藏就是封装吧。。。。封装是把过程和数据包围起来&#xff0c;对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念&#xff0c;即现实世界可以被描绘成一系列完全自治、封装的对象&#xff0c;这些对象通过一个受保护的接口访问其他对象。封装是一…

esb 和 开源esb_如果今天完成,ESB会是什么样子?

esb 和 开源esbJavaOne 2015即将结束&#xff0c;这又是一次很棒的社区活动。 我和Rafael进行了两次会议和一次HOL 。 我最喜欢的会议之一实际上是&#xff1a;谈论ESB&#xff0c;如果今天完成的话。 我以为那是过去&#xff1f; 我通常也倾向于这样说。 但是&#xff0c;系统…

log4j2 无日志记录_在Log4j2中更好地执行非日志记录器调用

log4j2 无日志记录使用Log4j 1.x并希望避免在某些情况下可能会造成额外的性能影响&#xff08;即使实际上未记录该消息&#xff09;时&#xff0c;通常使用日志记录防护 。 Java的简单日志记录外观 &#xff08; SLF4J &#xff09;带给Java日志记录的最吸引人的功能之一是能够…

JAVA8如何进行IDEA配置_IntelliJ Idea 配置jdk8

环境&#xff1a; 环境变量JAVA_HOME配置jdk1.8idea配置支持lambda&#xff1a;File -> Project Structure -> Modules -> Language level, 选择: 8-Lambdas, type annotations etc.File -> Project Structure -> Project -> Project language level, 选择…

spring 占位符默认值_Spring中的值注释中的占位符支持

spring 占位符默认值Value批注中的${...}占位符用于访问在PropertySource注册的属性。 这对于Spring应用程序中的Configuration bean非常有用&#xff0c;但不仅如此。 为确保这是可能的&#xff0c; PropertySourcesPlaceholderConfigurer必须存在于所有需要占位符解析的应用程…

java用户名检查数据库_登入界面账号密码是访问数据库,但登入问题时if判断时就是执行不了...

回复 2楼 林月儿我按着你的方法试了下&#xff0c;可还是这个判断不能执行 if(password.equals(drmm.getText())){view.setText("登入成功");完整代码如下&#xff1a;import java.awt.*;import java.awt.event.*;import *;import *;import java.…

五皇后问题 java_Java的5个古怪问题

五皇后问题 java我们有机会接触到一些最奇怪的Java难题 即使是最有经验的Java开发人员&#xff0c;也会在这篇文章中发现令人困惑的问题。 或者至少是有趣的&#xff08;绝对不公平&#xff09;。 在经历了Java Deathmatch冒险之后&#xff0c;我们决定这次发布一系列不同的问…

java加密成固定长度_Java使用MD5加密,生成的密文长度只有31位

在使用MD5加密时&#xff0c;生成的密文长度只有31位&#xff0c;该怎么解决&#xff1f;代码如下&#xff1a;public static String toMd5(String str) {String re null;byte encrypt[];try {byte[] tem str.getBytes();MessageDigest md5 MessageDigest.getInstance("…

可以自定义模板的ide_将IDE检查应用于自定义Java批注

可以自定义模板的ideJ2SE 5中注释的引入改变了我们编写和处理Java的方式。 除了Java SE的预定义注释外 &#xff0c;框架&#xff0c;IDE和工具包还引入了自己的自定义注释 。 Checker框架提供了一些示例&#xff0c;说明如何使用自定义批注在Java中增加类型安全性 。 在本文中…

java设置弹出框为模态_点击按钮弹出模态框的一系列操作代码实例

实现功能提交按钮功能&#xff1a;点击提交按钮的时候都会弹出模态框&#xff0c;但是有不同的状态&#xff1a;审核状态未通过&#xff1a;弹出未通过理由的input输入框&#xff0c;模态框中除了取消和确定按钮&#xff0c;新增确定并保存医院的按钮审核状态已通过&#xff1a…

spock框架_Spock VW:编写自定义的Spock框架扩展

spock框架Spock框架具有多个内置扩展 &#xff0c;这些扩展支持许多核心功能&#xff0c;例如Ignore和Timeout批注。 但更重要的是&#xff0c;鼓励开发人员编写自己的扩展。 例如&#xff0c; SpringExtension很好地将Spock与Spring框架集成在一起。 编写自定义扩展没有很好的…

java log 断点_项目中常见的log日志调用

第一种用法&#xff1a;引用org.apache.commons.logging.Log。import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;private static final Log logger LogFactory.getLog(PolicyAppBizAction.class); //PolicyAppBizAction.class是自己定义…