簡體   English   中英

在 GWT 中,是否保證按表單上的順序發送多部分表單數據?

[英]In GWT, is Multipart form-data guaranteed to be sent in the order it is on the form?

我有一個用FormPanel和三個FileUpload對象構建的表單。 三個FileUpload對象指的是不同類型的二進制文件。 我已經測試了很多,並且文件總是按照我在三個FileUpload對象中添加它們的順序(從上到下)放置在列表中。 因此,例如,在下面的表格中,文件 1、2 和 3 以該順序到達服務器(我已經用各種文件運行了 20 或 30 次):

文件上傳示例

那有保證嗎? 或者我應該找到一種方法來以某種方式標記它們?

使用 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...");
        }

    }
}

網頁.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 設置有效,但我仍然不確定上下文參數以及它們是否真的有所作為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM