java 服务器端实现HTTP无enctype=”multipart/form-data”文件上传

在java web中我们一般都是使用commons-fileupload 和cos 进行服务器端上传文件的处理,而这种情况通常是我们通过在网页中的form标签中设置enctype=”multipart/form-data”这样的信息,才可以。否则commons-fileupload和cos都不能获取到文件。HTML网页设置格式如下图所示:

<html>
<body>
<h2>Hello upload-file</h2>
<form method="POST" action="upload" enctype="multipart/form-data">
file upload:<br>
<input type="file" name="file" />
<input type="submit" value="submit">
</form>
</body>
</html>

这只是一个简单例子,但如果我们遇到这样的情况:我们有一个java本地的客户端,使用HTTP协议来上传文件,不过这里没有表单。commons-fileupload的服务器端就会报错

其实解决的办法也很简单,面对没有设置”multipart/form-data”属性的客户端,我们可以通过request.getInputStream() 获取输入流,从中读取文件内容。

下面是我写的一断简单代码,把输入流信息,写入到C盘的一个文件:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

 InputStream input= request.getInputStream(); //获取流
 OutputStream out = new FileOutputStream(new File("c://test.txt"));
 byte[] buffer = new byte[1024];
 int count;
 while ((count = input.read(buffer)) != -1) {
 out.write(buffer, 0, count);  //写文件
 }
 out.flush();
 out.close();
 input.close();
 }

不过这种方式是不能直接解析上面那种form表单的文件上传方式,他会在文件的前后各加上一段信息,下面是一个form表单上传,输入流中的信息:

------WebKitFormBoundaryOPczhvGNCBlneBER
Content-Disposition: form-data; name="file"; filename="??????.txt"
Content-Type: text/plain
#下面是我写入的文件内容
df03c9cf37c5fbc5a7894e04297127d7
3a9bb0371ea5789666ab438b3b7e05c2
#到此为止
------WebKitFormBoundaryOPczhvGNCBlneBER--

如果form中没有加上enctype=”multipart/form-data”属性信息,输入流中得到的只有在<input value=””>中设置的value值,因此,通过流来获取上传的文件,应该只适合于从客户端直接向服务器写文件。