在网页中上传文件时,会用到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
分享到:
相关推荐
本篇文章将深入探讨AJAX异步文件上传以及如何使用Servlet进行处理。 ### 1. AJAX异步文件上传原理 在HTML5之前,由于浏览器安全限制,AJAX无法直接处理文件,但HTML5引入了`FormData`对象,使得AJAX能够处理文件...
7. **MIME多部分解析**:Servlet 3.0引入了`Part`接口,用于处理MIME多部分请求,这在处理上传文件时非常有用。 8. **安全增强**:添加了新的安全相关API,如`HttpServletRequest.isUserInRole()`和`...
在CKEditor 3.6.0版本中,它提供了文件上传功能,使得用户可以直接在编辑器内上传图片或其他文件,极大地提高了内容创作的便利性。本教程将详细介绍如何通过Servlet来实现CKEditor的文件上传功能。 首先,我们需要...
在这个"Servlet 文件上传下载例子"中,我们将探讨如何使用Servlet实现文件的上传和下载功能,这对于构建一个简单的图片文件服务器至关重要。 1. **文件上传** - **MultipartRequest**: 在Servlet中,处理文件上传...
在文件上传和下载场景中,Servlet接收客户端请求,处理文件操作,并将结果返回给客户端。 三、文件上传步骤 1. **配置Servlet**:首先,需要在web.xml中注册一个Servlet,指定它处理的请求URL。 2. **创建Servlet**...
今天和大家分享下基于servlet的方式实现文件上传; 1、众所周知在不实用框架的时候使用表单模式实现文件上传是无法接收其他的参数的; 2、但是在使用mutipart/form-data模式上传的时候,其实非文件属性的属性的值是...
通过学习和使用Servlet API,开发者可以创建处理各种HTTP请求的服务器端应用,包括登录验证、数据处理、文件上传下载等。同时,Servlet API还与Java的JSP(JavaServer Pages)技术紧密结合,使得开发者可以在HTML...
在本案例"JAVA_servlet的文件上传"中,我们将深入探讨如何使用Servlet实现文件上传功能,这对于构建交互性强的Web应用程序是至关重要的。文件上传功能允许用户在Web表单中选择本地文件并将其发送到服务器进行存储或...
在上面的代码中,Servlet监听"/upload"路径,当接收到文件上传请求时,使用`ServletFileUpload`解析请求,并将每个文件项写入到指定的服务器目录("uploads/")。 文件下载部分则相对简单。Servlet可以提供一个链接...
开发者可以使用@MultipartConfig注解来处理多部分请求,例如文件上传,无需额外的库。 总之,Servlet API 3.0-alpha-1.jar为Web开发带来了许多增强功能和改进,包括更好的依赖管理、异步处理、更简洁的配置方式...
总的来说,结合JSP和Servlet,我们可以构建一个完整的文件上传系统,提供用户友好的前端界面,以及可靠的后端服务来处理上传请求。通过不断优化和调整,这样的系统可以满足各种复杂的企业级需求。
在文件上传场景中,Servlet接收POST请求,其中包含用户选择的文件数据。 Apache Commons FileUpload是一个流行的开源库,专门设计用来处理HTTP请求中的多部分数据,即文件上传。这个库简化了文件上传的复杂性,使...
2. 创建Servlet,重写`doPost`方法,因为文件上传通常涉及POST请求。 3. 使用FileUpload库解析请求的输入流,获取上传文件的信息(如文件名、大小等)。 4. 为每个上传文件创建一个临时或指定位置的文件,将输入流的...
5. **反馈信息**:上传完成后,Servlet可以返回一个确认消息,告知用户文件是否成功上传,或者在出现错误时提供错误信息。 四、安全性与优化 在实际应用中,我们还需要关注以下几个方面: - **文件大小限制**:设置...
在文件上传场景中,Servlet通常作为接收HTTP请求并处理数据的后端逻辑。 1. **Servlet处理文件上传** - 首先,我们需要创建一个Servlet来接收HTTP POST请求。这个请求通常包含multipart/form-data类型的数据,用于...
在这个"Servlet实现的上传文件实例"中,我们将深入探讨如何使用Servlet来处理客户端上传的文件。上传文件是Web应用程序中常见的功能,例如用户提交简历、上传图片或者共享文档等。以下是关于这个主题的详细知识点: ...
8. **多Part请求**:支持Multipart请求,使得上传多个文件变得更加简单。 9. **预读取请求**:允许服务器在接收到完整的HTTP请求之前就开始处理,优化了大文件上传和长轮询等场景的性能。 10. **URL重写**:提供了...
在处理文件上传需求时,JSP通常作为前端界面,而Servlet则负责后端逻辑处理。本篇文章将深入探讨如何使用JSP与Servlet进行文件上传,并特别关注如何解决中文文件名乱码的问题。 首先,我们需要理解文件上传的基本...
下面将详细介绍如何使用Servlet实现文件上传和下载的功能。 ### 文件上传 文件上传通常涉及到HTTP协议中的`multipart/form-data`编码类型,这是处理表单数据中包含文件的关键。Servlet 3.0及以上版本提供了更方便...