在GWT中,是否保证Multipart表单数据按照表单上的顺序发送?

时间:2017-10-03 06:08:11

标签: java file-upload gwt multipartform-data formpanel

我有一个使用FormPanel和三个FileUpload对象构建的表单。三个FileUpload对象引用不同类型的二进制文件。 我已经测试了很多,文件总是按照我在三个FileUpload对象中添加它们(从上到下)的顺序放在列表中。 因此,例如,在下面的表格中,文件1,2和3按顺序到达服务器(我已经用各种文件运行了20或30次):

file upload example

这有保证吗?或者我应该找到一种方法来标记它们吗?

1 个答案:

答案 0 :(得分:1)

使用FileItemIterator时,您可以检查表单上的每个项目。据我所知,他们确实是按照HTML格式进行的。

迭代器会告诉您它是表单字段还是上传文件,如我编写的旧函数所示。

在处理文件上传时,使用getFieldName()来标识表单字段,使用getName()来处理来自客户端的文件名。

难点在于在web.xml文件中的参数中分配servlet。

希望以下代码可以帮助您解决问题。

public class FileUploadServlet extends HttpServlet {

    private static final long serialVersionUID = -6988332690679764038L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

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

        String path = "/home/tomcat/engage/media/";
        String user = "";

        if (ServletFileUpload.isMultipartContent(request)) {

            FileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);

            boolean gotPath = false;

            String message = "";
            String media_category = "";

            StringBuilder sb = new StringBuilder();
            sb.append(Shared.getTimeStamp() + ": Uploading med files to category - ");

            try {
                FileItemIterator it = upload.getItemIterator(request);

                while (it.hasNext()) {
                    FileItemStream item = it.next();

                    //message += item.getFieldName() + ": ";

                    if (item.isFormField()) {
                        if (item.getFieldName().equals("MediaCategory")) {
                            media_category = Streams.asString(item.openStream());
                            path += media_category;

                            gotPath = true;

                            message += path + System.lineSeparator();

                        } else if (item.getFieldName().equals("UserName")) {

                            user += Streams.asString(item.openStream());

                        }
                    } else {
                        if (gotPath) {
                            String fileout = path + "/" + item.getName();

                            message += fileout + System.lineSeparator();

                            InputStream input = null;
                            OutputStream output = null;

                            try {
                                output = new FileOutputStream(new File(fileout));

                                input = item.openStream();

                                byte[] buffer = new byte[256];
                                int count;

                                while ((count = input.read(buffer)) > 0) {
                                    output.write(buffer, 0, count);
                                }

                            } finally {
                                input.close();
                                output.close();
                            }
                        }
                    }
                }
            } catch (Exception e) {
                response.sendRedirect("Error on item: " + e.getLocalizedMessage());
            }

            response.setStatus(HttpServletResponse.SC_CREATED);

            //response.getWriter().print(message);

            sb.append(message + System.lineSeparator());
            Shared.writeUserLog(user, sb.toString());

        } else {
            response.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, 
                    "Unsupported media type...");
        }

    }
}

的web.xml

<context-param>
    <!-- max size of the upload request -->
    <param-name>maxSize</param-name>
    <param-value>3145728</param-value>
</context-param>
<context-param>
    <!-- max size of any uploaded file -->
    <param-name>maxFileSize</param-name>
    <param-value>1024000</param-value>
</context-param>
<context-param>
    <!-- Useful in development mode to slow down the uploads in fast networks. 
        Put the number of milliseconds to sleep in each block received in the server. 
        false or 0, means don't use slow uploads -->
    <param-name>slowUploads</param-name>
    <param-value>200</param-value>
</context-param>

<servlet>
    <servlet-name>fileUpload</servlet-name>
    <servlet-class>com.parity.mediamanager.server.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>fileUpload</servlet-name>
    <url-pattern>/fileupload</url-pattern>
</servlet-mapping>

我知道servlet设置有效但我仍然不确定上下文参数以及它们是否确实有所作为。