在网页中上传文件时,会用到file类型的表单域,并且需要设置表单的ENC-TYPE属性为
“multipart/form-data”.当二进制的文件和文本内容的表单域一起传输时就比较复杂,因为已经指定了ENC-TYPE属性为“multipart/form-data”,不能简单用request.getParameter()来获取文本字段的内容。
解决办法一:根据http协议处理请求消息,因为客户端交给服务器的所有内容都在请求消息中,对请求消息进行分析,就可以取出所需要的各表单域的具体内容
本实例有两个线程类,一个负责监听固定端口8091,并创建另外一个线程,该线程得到客户端的http请求消息,并将其写入txt文件
该项目无需部署到tomcat中
监听程序
package requestmessage;
import java.io.IOException;
import java.net.ServerSocket;
//负责监听接口8091,接口只要不冲突,可以任意设置1024之后的
public class ServerAccept implements Runnable {
final static int LISTEN_PORT = 8091;
public void run() {
ServerSocket server = null;
try {
server = new ServerSocket(LISTEN_PORT);
} catch (IOException e) {
e.printStackTrace();
System.out.println("can not connect to port"+LISTEN_PORT);
}
while(true){
try {
new Thread(new ServerEchoRequest(server.accept())).start();
//打开新线程,与客户端连接时,server.accept()返回一个socket对象
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]){
new Thread(new ServerAccept()).start();
}
}
package requestmessage;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
//获得http请求,将客户端请求写入当前项目的一个request.txt文件中,
public class ServerEchoRequest implements Runnable {
Socket m_socket = null;
final static int MAX_BUFF = 4000;
private final static int TIMEOUT = 3000;
public ServerEchoRequest(Socket accept) {
m_socket = accept;
}
public void run() {
try {
getClient(m_socket);
} catch (IOException e) {
e.printStackTrace();
}
}
private void getClient(Socket m_socket2) throws IOException {
// 取得客户端发送数据的内容
DataInputStream in = new DataInputStream(m_socket2.getInputStream());
String s;
File f = new File("request.txt");
PrintWriter out = new PrintWriter(new FileWriter(f));
while((s=in.readLine())!=null){
System.out.println(s);
out.println(s);
out.flush();
}
}
}
客户端请求的html文件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>getRequestInfo.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<!-- enctype对应请求的content-type="multipart/form-data" -->
<form method="POST" action="http://localhost:8091"
enctype="multipart/form-data">
<p>
I D:
<input type="text" name="fieldID" size="20">
</p>
<p>
文件:
<input type="file" name="filedata" size="20">
</p>
<p>
<input type="submit" value="上传" name="uploadfile">
</p>
</form>
</body>
</html>
执行时先启动监听程序,而后双击html文件即可,结果如下:
点击“上传”,在项目下生成request.txt文件,内容如下:
POST / HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-TW,zh-cn;q=0.5
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; 360SE)
Content-Type: multipart/form-data; boundary=---------------------------7dafc2d3207c6
Accept-Encoding: gzip, deflate
Host: localhost:8091
Content-Length: 1409
Connection: Keep-Alive
Cache-Control: no-cache
-----------------------------7dafc2d3207c6
Content-Disposition: form-data; name="fieldID"
-----------------------------7dafc2d3207c6
Content-Disposition: form-data; name="filedata"; filename="C:\Documents and Settings\Administrator\???é??\??????\?????·??????è????????.txt"
Content-Type: text/plain
文件的内容
-----------------------------7dafc2d3207c6
Content-Disposition: form-data; name="uploadfile"
??????
-----------------------------7dafc2d3207c6--
代码下载见附件
- 大小: 61.4 KB
分享到:
相关推荐
今天和大家分享下基于servlet的方式实现文件上传; 1、众所周知在不实用框架的时候使用表单模式实现文件上传是无法接收其他的参数的; 2、但是在使用mutipart/form-data模式上传的时候,其实非文件属性的属性的值是...
ajax异步文件上传,servlet处理
假如一个场景,用户上传文件,某些用户网速较慢,同时存在100个这样的用户,如果BIO且最大线程设为100会导致线程用完。NIO怎么来解决这个问题? 本实例采用tomcat8作为容器,开启异步servlet读写事件,解决高并发IO...
HttpClient 上传文件 Servlet 处理文件上传 commons-fileupload 处理文件上传 commons-fileupload 处理文件上传,在struts中可以不用对应actionform,在jsp,servelet中应用都很方便
Smiley的HTTP代理Servlet 这是Java Servlet形式的HTTP代理(也称为网关)。 HTTP代理对于AJAX应用程序与托管Web应用程序以外的主机上的Web可访问服务进行通信很有用。 它是反向代理,实际上不是转发代理,尽管...
Android 代码中实现使用 httpurlconnent 原生网络访问方式实现 get请求 psot 带参数请求 以及文件下载 文件断点下载 以及进度提示 文件下载功能 java端采用servlet实现相应接口 返回json数据
vue form表单post请求结合Servlet实现文件上传功能 <template> <div> ($event)"> </div> </template> <script> export default { created(){ this.path = this.$route.query; for (let i in this.path) {...
如果表单中有 file 控件,并且用户选择了上载文件,则需要分析出字段的名称、文件在浏览器端的名字、文件的 Content-Type 和文件的内容。 字节数组的内容可以分解如下: 具体解码过程也可以分为两个步骤: 将...
servlet实现文件上传的时候,当文件较大的时候,会有文件上传的进度条提示,使用的原理是使用jquery的异步请求,在jsp页面设置定时器,每隔一段时间获取文件上传监听器同步到session中的最新的上传信息。
2项目为实现文件上传的三种方式的源码,详细说明见我的博客。...模拟Post请求/servlet 实现文件上传 jetty_upload-springmvc项目:(3).模拟Post请求/Controller(SpringMvc)实现文件上传 请尊重原著,请勿随意传播。
第11章展示如何利用Servlet3的文件上传特性,以及如何在客户端改善用户的体验;第12章解释如何通过编程方式将资源发送到浏览器;第13章介绍如何利用Decorator模式以及类来改变Servlet请求和响应的行为;第14章讨论...
第6章 利用Servlet上传和下载文件 6. 1 得到HTTP请求消息的内容 6. 2 利用Servlet得到上传的文件 6. 2. 1 上传文件及表单域的请求实体的分析 6. 2. 2 得到上传文件的编程实例 6. 3 使用Servlet下载文件 6. 3. ...
实现web开发中的文件上传功能,需完成如下二步操作: ...设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。
利用Servlet来实现文件上传。 Upload.java package com.zj.sample; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet....
Servlet3.0开始提供了一系列的注解来配置Servlet、Filter、Listener等等。这种方式可以极大的简化在开发中大量的xml的配置。从这个版本开始,web.xml可以不再需要,使用相关的注解同样可以完成相应的配置。 a.选中...
新建一个servlet: FileUpload.java用于文件上传: package com.drp.util.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet....
第11章展示如何利用Servlet 3的文件上传特性,以及如何在客户端改善用户的体验;第12章解释如何通过编程方式将资源发送到浏览器;第13章介绍如何利用Decorator模式以及类来改变Servlet请求和响应的行为;第14章讨论...
浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件。
主要介绍了Servlet获取AJAX POST请求中参数以form data和request payload形式传输的方法,结合实例形式详细分析了post数据发送及获取请求数据的原理与相关操作注意事项,需要的朋友可以参考下