关于java:如何使用JSP / Servlet将文件上传到服务器?

How to upload files to server using JSP/Servlet?

如何使用jsp/servlet将文件上载到服务器?我试过这个:

1
2
3
4
5
<form action="upload" method="post">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

但是,我只得到文件名,而不是文件内容。当我把enctype="multipart/form-data"加到

中时,request.getParameter()返回null

在研究过程中,我偶然发现了Apache公共文件上传。我试过这个:

1
2
3
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request); // This line is where it died.

不幸的是,servlet抛出了一个没有明确消息和原因的异常。以下是stacktrace:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SEVERE: Servlet.service() for servlet UploadServlet threw exception
javax.servlet.ServletException: Servlet execution threw an exception
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:313)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:637)


介绍

要浏览和选择要上载的文件,您需要表单中的html 字段。如HTML规范所述,您必须使用POST方法,表单的enctype属性必须设置为"multipart/form-data"。好的。

1
2
3
4
5
<form action="upload" method="post" enctype="multipart/form-data">
    <input type="text" name="description" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

提交这样的表单后,二进制多部分表单数据在请求主体中的格式与未设置enctype时的格式不同。好的。

在servlet 3.0之前,servlet API本身不支持multipart/form-data。它只支持默认的EDOCX1格式enctype(6)。当使用多部分表单数据时,request.getParameter()和consorts都将返回null。这就是著名的ApacheCommons文件上传进入图片的地方。好的。不要手动解析它!

理论上,您可以根据ServletRequest#getInputStream()自己解析请求体。然而,这是一项精确而乏味的工作,需要对RFC2388有精确的了解。你不应该试着自己去做,或者复制粘贴一些在互联网上其他地方找到的本地库代码。许多在线资源在这方面都失败了,比如roseindia.net。另请参见上传PDF文件。您应该使用一个真正的库,它被使用(并被隐式测试!)以百万计的用户数年之久。这样的库已经证明了它的健壮性。好的。当您已经使用servlet 3.0或更高版本时,请使用本机API

如果您至少使用servlet 3.0(tomcat 7、jetty 9、jboss as 6、glassfish 3等),那么您可以使用标准API提供的HttpServletRequest#getPart()来收集单个多部分表单数据项(大多数servlet 3.0实现实际上都使用了封面下的apache commons fileupload!).另外,通常情况下,getParameter()可以使用普通格式字段。好的。

首先用@MultipartConfig注释您的servlet,以便它识别和支持multipart/form-data请求,从而使getPart()工作:好的。

1
2
3
4
5
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    // ...
}

然后,执行其doPost()如下:好的。

1
2
3
4
5
6
7
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String description = request.getParameter("description"); // Retrieves <input type="text" name="description">
    Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file">
    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
    InputStream fileContent = filePart.getInputStream();
    // ... (do your job here)
}

注意Path#getFileName()。这是获取文件名的MSIE修复程序。此浏览器错误地沿名称发送完整的文件路径,而不是仅发送文件名。好的。

如果您有用于多文件上传的,请按以下方式收集(不幸的是,没有request.getParts("file")这样的方法):好的。

1
2
3
4
5
6
7
8
9
10
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // ...
    List<Part> fileParts = request.getParts().stream().filter(part ->"file".equals(part.getName())).collect(Collectors.toList()); // Retrieves <input type="file" name="file" multiple="true">

    for (Part filePart : fileParts) {
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
        InputStream fileContent = filePart.getInputStream();
        // ... (do your job here)
    }
}

当您还不在servlet 3.1上时,手动获取提交的文件名

注意,Servlet 3.1(Tomcat 8、Jetty 9、Wildfly 8、Glassfish 4等)中引入了Part#getSubmittedFileName()。如果您还没有使用servlet 3.1,那么您需要一个额外的实用程序方法来获取提交的文件名。好的。

1
2
3
4
5
6
7
8
9
private static String getSubmittedFileName(Part part) {
    for (String cd : part.getHeader("content-disposition").split(";")) {
        if (cd.trim().startsWith("filename")) {
            String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace(""","");
            return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\') + 1); // MSIE fix.
        }
    }
    return null;
}
1
String fileName = getSubmittedFileName(filePart);

注意获取文件名的MSIE修复程序。此浏览器错误地沿名称发送完整的文件路径,而不是仅发送文件名。好的。当您还没有使用servlet 3.0时,请使用apache commons fileupload

如果您还没有使用servlet 3.0(现在不是升级的时候吗?)通常的做法是使用ApacheCommonsFileUpload解析multpart表单数据请求。它有一个优秀的用户指南和常见问题解答(仔细浏览两者)。还有O'Reilly("cos")MultipartRequest,但它有一些(小的)bug,多年来没有得到有效的维护。我不建议你用它。ApacheCommons文件上传仍在积极维护,目前非常成熟。好的。

为了使用Apache Commons文件上传,您需要在webapp的/WEB-INF/lib中至少包含以下文件:好的。

  • commons-fileupload.jar
  • commons-io.jar

您的初始尝试很可能失败了,因为您忘记了commons IO。好的。

下面是一个启动示例,当使用Apache Commons文件上传时,您的UploadServletdoPost()可能看起来像:好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        for (FileItem item : items) {
            if (item.isFormField()) {
                // Process regular form field (input type="text|radio|checkbox|etc", select, etc).
                String fieldName = item.getFieldName();
                String fieldValue = item.getString();
                // ... (do your job here)
            } else {
                // Process form file field (input type="file").
                String fieldName = item.getFieldName();
                String fileName = FilenameUtils.getName(item.getName());
                InputStream fileContent = item.getInputStream();
                // ... (do your job here)
            }
        }
    } catch (FileUploadException e) {
        throw new ServletException("Cannot parse multipart request.", e);
    }

    // ...
}

很重要的一点是,在同一个请求之前,您不要打电话给getParameter()getParameterMap()getParameterValues()getInputStream()getReader()等。否则servlet容器将读取并解析请求体,因此apache commons fileupload将得到一个空的请求体。另请参见a.o.servletfileupload parseRequest(请求)返回空列表。好的。

注意FilenameUtils#getName()。这是获取文件名的MSIE修复程序。此浏览器错误地沿名称发送完整的文件路径,而不是仅发送文件名。好的。

或者,您也可以用一个Filter包装所有这些内容,它自动解析所有内容,并将这些内容放回请求的参数映射中,这样您就可以继续使用request.getParameter(),并通过request.getAttribute()检索上载的文件。你可以在这篇博客文章中找到一个例子。好的。getParameter()的glassfish 3虫仍返回null的解决方案

注意,早于3.1.2的Glassfish版本有一个bug,其中getParameter()仍然返回null。如果您的目标是这样一个容器,并且不能升级它,那么您需要借助这个实用方法从getPart()中提取值:好的。

1
2
3
4
5
6
7
8
9
private static String getValue(Part part) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(),"UTF-8"));
    StringBuilder value = new StringBuilder();
    char[] buffer = new char[1024];
    for (int length = 0; (length = reader.read(buffer)) > 0;) {
        value.append(buffer, 0, length);
    }
    return value.toString();
}
1
String description = getValue(request.getPart("description")); // Retrieves <input type="text" name="description">

保存上传文件(不要使用getRealPath()part.write())

有关将获得的InputStream变量(上述代码段中所示的fileContent变量)正确保存到磁盘或数据库的详细信息,请参阅以下答案:好的。

  • 在servlet应用程序中保存上载文件的推荐方法
  • 如何上传图像并保存到数据库中?
  • 如何将部件转换为blob,以便将其存储在mysql中?

服务上载的文件

有关将保存的文件从磁盘或数据库正确服务回客户端的详细信息,请参阅以下答案:好的。

  • 使用标记从webapps/webcontext/deploy文件夹外部加载图像
  • 如何从JSP页面中的数据库中检索和显示图像?
  • 在Java Web应用程序中从应用服务器外部提供静态数据的最简单方法
  • 支持HTTP缓存的静态资源servlet抽象模板

微缩的形式

下面是如何使用Ajax(和jquery)上传的答案。请注意,收集表单数据的servlet代码不需要为此进行更改!只有您的响应方式可能会改变,但这相当简单(即,不必转发到JSP,只需打印一些JSON或XML,甚至纯文本,具体取决于负责Ajax调用的脚本所期望的内容)。好的。

  • 如何使用jsp/servlet和ajax将文件上传到服务器?
  • 通过xmlhttprequest以多部分形式发送文件
  • HTML5文件上传到Java Servlet

希望这一切都有帮助:)好的。好啊。


如果您碰巧使用了Spring MVC,那么下面是如何:(我把这个留在这里,以防有人发现它有用)。

使用enctype属性设置为"multipart/form-data"的表单(与balusc的答案相同)

1
2
3
4
<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="Upload"/>
</form>

在控制器中,将请求参数file映射到MultipartFile类型,如下所示:

1
2
3
4
5
6
7
@RequestMapping(value ="/upload", method = RequestMethod.POST)
public void handleUpload(@RequestParam("file") MultipartFile file) throws IOException {
    if (!file.isEmpty()) {
            byte[] bytes = file.getBytes(); // alternatively, file.getInputStream();
            // application logic
    }
}

您可以使用MultipartFilegetOriginalFilename()getSize()获得文件名和大小。

我用弹簧版4.1.1.RELEASE测试过这个。


您需要将common-io.1.4.jar文件包含在您的lib目录中,或者如果您在任何编辑器(如netbeans)中工作,那么您需要转到项目属性,只需添加jar文件即可完成。

要获取common.io.jar文件,只需谷歌它,或者直接访问ApacheTomcat网站,在那里您可以选择免费下载该文件。但请记住一件事:如果您是Windows用户,请下载二进制zip文件。


我正在为每个HTML表单使用公共servlet,不管它是否有附件。此servlet返回一个TreeMap,其中键是jsp名称参数,值是用户输入,并将所有附件保存在固定目录中,然后重命名您选择的目录。这里连接是具有连接对象的自定义接口。我想这对你有帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class ServletCommonfunctions extends HttpServlet implements
        Connections {

    private static final long serialVersionUID = 1L;

    public ServletCommonfunctions() {}

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

    public SortedMap<String, String> savefilesindirectory(
            HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // Map<String, String> key_values = Collections.synchronizedMap( new
        // TreeMap<String, String>());
        SortedMap<String, String> key_values = new TreeMap<String, String>();
        String dist = null, fact = null;
        PrintWriter out = response.getWriter();
        File file;
        String filePath ="E:\\FSPATH1\\2KL06CS048\";
        System.out.println("
Directory Created   ????????????"
            + new File(filePath).mkdir());
        int maxFileSize = 5000 * 1024;
        int maxMemSize = 5000 * 1024;
        // Verify the content type
        String contentType = request.getContentType();
        if ((contentType.indexOf("
multipart/form-data") >= 0)) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // maximum size that will be stored in memory
            factory.setSizeThreshold(maxMemSize);
            // Location to save data that is larger than maxMemSize.
            factory.setRepository(new File(filePath));
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            // maximum file size to be uploaded.
            upload.setSizeMax(maxFileSize);
            try {
                // Parse the request to get file items.
                @SuppressWarnings("
unchecked")
                List<FileItem> fileItems = upload.parseRequest(request);
                // Process the uploaded file items
                Iterator<FileItem> i = fileItems.iterator();
                while (i.hasNext()) {
                    FileItem fi = (FileItem) i.next();
                    if (!fi.isFormField()) {
                        // Get the uploaded file parameters
                        String fileName = fi.getName();
                        // Write the file
                        if (fileName.lastIndexOf("
\") >= 0) {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("
\")));
                        } else {
                            file = new File(filePath
                                + fileName.substring(fileName
                                        .lastIndexOf("
\") + 1));
                        }
                        fi.write(file);
                    } else {
                        key_values.put(fi.getFieldName(), fi.getString());
                    }
                }
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }
        return key_values;
    }
}


弹簧MVC我已经试了好几个小时了并且设法有一个更简单的版本,可以同时使用表单输入数据和图像。

1
2
3
4
5
6
<form action="/handleform" method="post" enctype="multipart/form-data">
  <input type="text" name="name" />
  <input type="text" name="age" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

要处理的控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Controller
public class FormController {
    @RequestMapping(value="/handleform",method= RequestMethod.POST)
    ModelAndView register(@RequestParam String name, @RequestParam int age, @RequestParam MultipartFile file)
            throws ServletException, IOException {

        System.out.println(name);
        System.out.println(age);
        if(!file.isEmpty()){
            byte[] bytes = file.getBytes();
            String filename = file.getOriginalFilename();
            BufferedOutputStream stream =new BufferedOutputStream(new FileOutputStream(new File("D:/" + filename)));
            stream.write(bytes);
            stream.flush();
            stream.close();
        }
        return new ModelAndView("index");
    }
}

希望有帮助:)


在Tomcat 6 o 7中没有组件或外部库

在web.xml文件中启用上载:

http://joseluisbz.wordpress.com/2014/01/17/手动安装php-tomcat和httpd-lounge/启用%20文件%20上载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>
    <init-param>
        <param-name>fork</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>xpoweredBy</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>

正如你所看到的:

1
2
3
4
    <multipart-config>
      <max-file-size>3145728</max-file-size>
      <max-request-size>5242880</max-request-size>
    </multipart-config>

使用JSP上传文件。文件夹:

在HTML文件中

1
2
3
4
<form method="post" enctype="multipart/form-data" name="Form">

  <input type="file" name="fFoto" id="fFoto" value="" /></td>
  <input type="file" name="fResumen" id="fResumen" value=""/>

在JSP文件或servlet中

1
2
3
4
5
6
7
8
9
    InputStream isFoto = request.getPart("fFoto").getInputStream();
    InputStream isResu = request.getPart("fResumen").getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte buf[] = new byte[8192];
    int qt = 0;
    while ((qt = isResu.read(buf)) != -1) {
      baos.write(buf, 0, qt);
    }
    String sResumen = baos.toString();

编辑您的代码以满足servlet的要求,比如最大文件大小、最大请求大小和其他您可以设置的选项…


如果将Geronimo与嵌入的Tomcat一起使用,则会出现此问题的另一个来源。在这种情况下,在多次测试commons io和commons fileupload之后,问题出现在处理commons xxx jar的父类加载器上。这必须加以预防。车祸总是发生在:

1
fileItems = uploader.parseRequest(request);

请注意,文件项的列表类型随当前版本的commons fileupload而改变,具体来说是List,而不是以前版本的通用List

我在Eclipse项目中添加了commons文件上传和commons IO的源代码,以跟踪实际的错误,最后获得了一些见解。首先,引发的异常类型是可丢弃的,而不是声明的FileIOException,甚至是异常(这些不会被捕获)。其次,错误消息是模糊的,因为它声明找不到类,因为axis2找不到commons io。Axis2根本不在我的项目中使用,但作为标准安装的一部分,它作为geronimo repository子目录中的文件夹存在。

最后,我找到了一个能有效解决问题的地方。您必须在部署计划中从父加载程序隐藏JAR。它被放入geronimo-web.xml中,我的完整文件如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Pasted from <http://osdir.com/ml/user-geronimo-apache/2011-03/msg00026.html>



<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web:web-app xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-2.0" xmlns:client="http://geronimo.apache.org/xml/ns/j2ee/application-client-2.0" xmlns:conn="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:ejb="http://openejb.apache.org/xml/ns/openejb-jar-2.2" xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-2.0" xmlns:name="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pers="http://java.sun.com/xml/ns/persistence" xmlns:pkgen="http://openejb.apache.org/xml/ns/pkgen-2.1" xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0" xmlns:web="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1">
    <dep:environment>
        <dep:moduleId>
            <dep:groupId>DataStar</dep:groupId>
            <dep:artifactId>DataStar</dep:artifactId>
            <dep:version>1.0</dep:version>
            <dep:type>car</dep:type>
        </dep:moduleId>

<!--Don't load commons-io or fileupload from parent classloaders-->
        <dep:hidden-classes>
            <dep:filter>org.apache.commons.io</dep:filter>
            <dep:filter>org.apache.commons.fileupload</dep:filter>
        </dep:hidden-classes>
        <dep:inverse-classloading/>        


    </dep:environment>
    <web:context-root>/DataStar</web:context-root>
</web:web-app>

以下是使用apache commons fileupload的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// apache commons-fileupload to handle file upload
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(DataSources.TORRENTS_DIR()));
ServletFileUpload fileUpload = new ServletFileUpload(factory);

List<FileItem> items = fileUpload.parseRequest(req.raw());
FileItem item = items.stream()
  .filter(e ->
 "the_upload_name".equals(e.getFieldName()))
  .findFirst().get();
String fileName = item.getName();

item.write(new File(dir, fileName));
log.info(fileName);

1
DiskFileUpload upload=new DiskFileUpload();

从该对象中,您必须获取文件项和字段,然后您可以将其存储到服务器中,如下所示:

1
2
3
String loc="./webapps/prjct name/server folder/"+contentid+extension;
File uploadFile=new File(loc);
item.write(uploadFile);

您可以使用jsp/servlet上传文件。

1
2
3
4
5
<form action="UploadFileServlet" method="post">
  <input type="text" name="description" />
  <input type="file" name="file" />
  <input type="submit" />
</form>

另一方面,服务器端。使用以下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
     package com.abc..servlet;

import java.io.File;
---------
--------


/**
 * Servlet implementation class UploadFileServlet
 */

public class UploadFileServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public UploadFileServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.sendRedirect("../jsp/ErrorPage.jsp");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

            PrintWriter out = response.getWriter();
            HttpSession httpSession = request.getSession();
            String filePathUpload = (String) httpSession.getAttribute("path")!=null ? httpSession.getAttribute("path").toString() :"" ;

            String path1 =  filePathUpload;
            String filename = null;
            File path = null;
            FileItem item=null;


            boolean isMultipart = ServletFileUpload.isMultipartContent(request);

            if (isMultipart) {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                String FieldName ="";
                try {
                    List items = upload.parseRequest(request);
                    Iterator iterator = items.iterator();
                    while (iterator.hasNext()) {
                         item = (FileItem) iterator.next();

                            if (fieldname.equals("description")) {
                                description = item.getString();
                            }
                        }
                        if (!item.isFormField()) {
                            filename = item.getName();
                            path = new File(path1 + File.separator);
                            if (!path.exists()) {
                                boolean status = path.mkdirs();
                            }
                            /* START OF CODE FRO PRIVILEDGE*/

                            File uploadedFile = new File(path + Filename);  // for copy file
                            item.write(uploadedFile);
                            }
                        } else {
                            f1 = item.getName();
                        }

                    } // END OF WHILE
                    response.sendRedirect("welcome.jsp");
                } catch (FileUploadException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }  
    }

}

HTML页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<head>
File Uploading Form
</head>
<body>
File Upload:
Select a file to upload: <br />
<form action="UploadServlet" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Upload File" />
</form>
</body>
</html>

servlet文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Import required java libraries
import java.io.*;
import java.util.*;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;

public class UploadServlet extends HttpServlet {

   private boolean isMultipart;
   private String filePath;
   private int maxFileSize = 50 * 1024;
   private int maxMemSize = 4 * 1024;
   private File file ;

   public void init( ){
      // Get the file location where it would be stored.
      filePath =
             getServletContext().getInitParameter("file-upload");
   }
   public void doPost(HttpServletRequest request,
               HttpServletResponse response)
              throws ServletException, java.io.IOException {
      // Check that we have a file upload request
      isMultipart = ServletFileUpload.isMultipartContent(request);
      response.setContentType("text/html");
      java.io.PrintWriter out = response.getWriter( );
      if( !isMultipart ){
         out.println("<html>");
         out.println("<head>");
         out.println("Servlet upload");  
         out.println("</head>");
         out.println("<body>");
         out.println("<p>
No file uploaded
</p>"
);
         out.println("</body>");
         out.println("</html>");
         return;
      }
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );

      try{
      // Parse the request to get file items.
      List fileItems = upload.parseRequest(request);

      // Process the uploaded file items
      Iterator i = fileItems.iterator();

      out.println("<html>");
      out.println("<head>");
      out.println("Servlet upload");  
      out.println("</head>");
      out.println("<body>");
      while ( i.hasNext () )
      {
         FileItem fi = (FileItem)i.next();
         if ( !fi.isFormField () )  
         {
            // Get the uploaded file parameters
            String fieldName = fi.getFieldName();
            String fileName = fi.getName();
            String contentType = fi.getContentType();
            boolean isInMemory = fi.isInMemory();
            long sizeInBytes = fi.getSize();
            // Write the file
            if( fileName.lastIndexOf("\") >= 0 ){
               file = new File( filePath +
               fileName.substring( fileName.lastIndexOf("
\"))) ;
            }else{
               file = new File( filePath +
               fileName.substring(fileName.lastIndexOf("
\")+1)) ;
            }
            fi.write( file ) ;
            out.println("
Uploaded Filename:" + fileName +"");
         }
      }
      out.println("
</body>");
      out.println("
</html>");
   }catch(Exception ex) {
       System.out.println(ex);
   }
   }
   public void doGet(HttpServletRequest request,
                       HttpServletResponse response)
        throws ServletException, java.io.IOException {

        throw new ServletException("
GET method used with" +
                getClass( ).getName( )+"
: POST method required.");
   }
}

Web.XML

编译上面的servlet uploadservlet并在web.xml文件中创建所需条目,如下所示。

1
2
3
4
5
6
7
8
9
<servlet>
   <servlet-name>UploadServlet</servlet-name>
   <servlet-class>UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>UploadServlet</servlet-name>
   <url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>


发送多个文件存档,我们必须使用enctype="multipart/form-data"。在输入标签中使用multiple="multiple"发送多个文件

1
2
3
4
<form action="upload" method="post" enctype="multipart/form-data">
 <input type="file" name="fileattachments"  multiple="multiple"/>
 <input type="submit" />
</form>