Java 文件上传

最近用到文件上传,遇见几个小问题,隔了几天才解决。包括在 enctype 为 multipart/form-data 的表单中取其他参数,url 传递中文参数等。

先说下表单。要想传文件,必须指定表单属性:enctype=" multipart/form-data" 。如果还想在这样的表单中添加其他文本域,那么抱歉, request.getParameter("xxx") 的办法永远取不到值了。可能你需要查阅所使用的上传组件的 API 文档 (如 SmartUpload),来看看有没有办法了。

但是,我只是期望上传文件的同时得知此文件属于哪个 post 。传这个 post_id ,让我十分无奈 —— 我总不能放在 session 里面吧?

用 action 来传递简单参数

最后没辙了,把参数直接写在表单的 action 里:action="upload?id=1989" 。还真管用。在servlet 的 doPost 方法中 request.getParameter("id") 一取一个准儿(时而去到时而取不到,那是见鬼了),没想到这个 Google 不会的问题,就这么解决了。

还是 PHP 简单直观,3个数组就解决了这个问题。很久前曾为这个问题困惑:action中指定url (GET方法)的 POST 表单提交到 servlet 后,触发的是 doPost 还是 doGet 方法?简单测试之后,结果是:只执行了 doPost 方法

现在遇到问题,就受到上面的测试结果影响,干扰了思路 —— 其实无论调用那种方法,其参数 request 是一样的。

GET 方法传中文参数

我在 Google 上面的问题的时候,发现很多人问这个问题。有人提出了复杂的 JS + Java类来实现。我通常只转下编码就 OK 了啊,这问题没那么复杂吧?

String name = request.getParameter("name");
name = new String ( name.getBytes("ISO-8859-1" ) ,"GBK" );

文件上传

捎带说一下。使用的是Apache组织的commons项目中的FileUpload。需要下载的有:

另,还有人提到用软件去下载 API 网页,其实上面的压缩包里就有了文档了。安排好 jar 包之后,就可以测试一下了。

<!-- file.html -->

<form action="upload.jsp" method="post" enctype="multipart/form-data">
<input type="file" name="upload" >
<input type="submit">
</form>

Jsp 比较方便,如果在 servlet 中应用记得捕获异常。建立好 upload 文件夹来存文件。

<!-- upload.jsp -->

<%@ page pageEncoding="gbk" %>
<%@page import="org.apache.commons.fileupload.DiskFileUpload" %>
<%@page import="java.util.List" %>
<%@page import="org.apache.commons.fileupload.FileItem" %>
<%@page import="java.io.File" %>
<%

<!-- 很无奈,WP 编辑器总是把 尖括号变成 &lt;,而被 pre 标签包裹的,它又不管了 -->

DiskFileUpload upload = new DiskFileUpload();
List list = upload.parseRequest(request);
for(int i=0; i < list.size(); i++)    {
FileItem item = (FileItem)list.get(i);
item.write(new File(request.getRealPath("/upload"), item.getName() ) ); }

%>

5 条评论

  1. 太深奥了,几乎没看懂,呵呵!

  2. 飘过,忽视中!应该说自己太差,不太看懂!

  3. 我对java不懂..
    第一次来这里,’
    看来博主是个编程高手

  4. 交流一下,我也是学Java的,呵呵
    交换个链接吧,你的已做好……

  5. Leeiio

    对于大文件上载,我其实偏向于用flash来实现~

发表评论

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">