【问题标题】:Browser not loading HTML response after doing jquery.ajax POST to a servlet对 servlet 执行 jquery.ajax POST 后浏览器未加载 HTML 响应
【发布时间】:2013-07-11 21:08:31
【问题描述】:

在对多个文件进行 jquery.ajax 发布后,我无法加载一些由 servlet 返回的 html。

我可以上传文件(图片)就好了。我有一个 servlet,它对照片进行一些处理并从图片中提取一些元数据。处理完照片后,我想将一些提取的元数据传递给 JSP,最终返回给浏览器。

所有这些都可以正常工作。我用我的数据加载请求对象并将其重定向到我的 JSP。但是……只要 JSP 响应浏览器,页面就不会被加载。

使用 firebug 我可以看到 JSP 以我想要的方式正确生成 HTML,并且浏览器在响应中获取 html 文本......它只是不加载页面。页面保持原样,我可以简单地在 Firebug 中查看响应中的 HTML 文本。

任何想法可能是什么问题?这是一些相关的代码...

上传文件到servlet的Javascript函数...

function uploadPictures() {
    var input = document.getElementById('filesToUpload');
    var fileList = [];
    var files = new FormData();

    for(var i = 0; i < input.files.length; i++) {       
        files.append("file", input.files[i]);
    }

    $.ajax({
        type        :   "POST",
        url         :   "/uploadPhotos",
        data        :   files,
        dataType    :   "HTML",
        processData :   false,
        contentType :   false
    });
}

Servlet 代码

@MultipartConfig
public class UploadPhotosServlet extends HttpServlet {

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        String url = "/uploadForm.jsp";
        RequestDispatcher dispatcher = 
            getServletContext().getRequestDispatcher(url);
        String basePath = getInitParameter("photosRoot");
        HashMap<String,String> files = new HashMap<String,String>();

        java.util.Collection<Part> parts = request.getParts();
        for (Part part : parts) {
            String filename = getFilename(part);
            InputStream fileContent = part.getInputStream();

            OutputStream outFile = new FileOutputStream(new File(basePath + "screen/" + filename));
            int read = 0;
            byte[] bytes = new byte[1024];

            while((read = fileContent.read(bytes)) != -1) {
                outFile.write(bytes, 0, read);
            }

            fileContent.close();
            outFile.flush();
            outFile.close();

            File img = new File(basePath + "screen/" + filename);
            File thumb = new File(basePath + "screen/thumbnails/" + filename);

            try {
                Metadata metadata = ImageMetadataReader.readMetadata(img);

                for(Directory directory : metadata.getDirectories()) {
                    if(directory.containsTag(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL)) {
                        Date date = directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        files.put(filename, sdf.format(date));
                        break;
                    } else if(directory.containsTag(ExifIFD0Directory.TAG_DATETIME)) {
                        Date date = directory.getDate(ExifIFD0Directory.TAG_DATETIME);
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        files.put(filename, sdf.format(date));
                        break;
                    }
                }

                BufferedImage buffImg = ImageIO.read(img);
                BufferedImage buffThumb = Scalr.resize(buffImg, 150);

                ImageIO.write(buffThumb, "jpg", thumb);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ImageProcessingException e) {
                e.printStackTrace();
            }
        }

        request.setAttribute("files", files);
        dispatcher.forward(request, response);
    }

    private static String getFilename(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;
    }
}

如上所述,重定向到 (uploadForm.jsp) 的 JSP 生成得很好。 Firebug 将在对 servlet 的调用的响应中向我显示 HTML 代码……但是,浏览器停留在上传表单所在的页面上。

感谢您的帮助。

【问题讨论】:

  • 执行 ajax 时不应加载页面。这有点意思,没有页面重新加载。如果要重新加载页面,请不要使用 ajax。否则,从请求返回的内容可以在成功回调中访问。
  • 当我在网上搜索如何将多个文件上传到服务器时,我只能得到 AJAX 方法。我也尝试过使用 XmlHttpRequest 对象,但结果相同。您如何建议以“非 ajax”的方式进行操作?
  • 创建一个表单,例如&lt;form action="myactpage.jsp"&gt;&lt;/form&gt;,将你的文件输入移动到其中,然后触发表单的提交事件。
  • 我很尴尬地说,我的狭隘视野使我无法考虑简单的形式。我想我只是想让它比它需要的复杂得多。我已经修好了。谢谢您的帮助。如果您想以这种方式发布,我很乐意接受您的回答。如果没有,再次感谢您的帮助。

标签: jquery ajax jsp servlets


【解决方案1】:

看起来你真正想要的比你现在做的要简单得多。

<form action="/uploadPhotos" method="post" enctype="multipart/form-data">
    <input type="file" multiple name="filesToUpload" />
    <button type="submit">Upload</button>
</form>

【讨论】:

    【解决方案2】:

    ajax 不会为您重新加载页面,这就是使用 ajax 的全部目的。但是,您可以使用 ajax 的 complete 设置强制页面重新加载,如此处所述 http://api.jquery.com/jQuery.ajax/

    completeajax 的回调总是在 ajax 响应返回后调用,无论结果如何(成功或失败)

    总而言之,您需要执行以下操作:

    $.ajax({
        type        :   "POST",
        url         :   "/uploadPhotos",
        data        :   files,
        dataType    :   "HTML",
        processData :   false,
        contentType :   false,
        complete: function () {
             location.reload(); //or other browser specific reload method
        }
    });
    

    如果complete 不是您想要的,请尝试改用successerror

    success会在返回HTML状态码为2xx或3xx时调用

    error会在返回HTML状态码为4xx或5xx时调用

    根据你的需要使用它

    【讨论】:

      【解决方案3】:

      AJAX 方法不应该刷新页面。如果你想在ajax请求的success函数中使用window.location,可以使用ajax请求

      $.ajax({
          type        :   "POST",
          url         :   "/uploadPhotos",
          data        :   files,
          dataType    :   "HTML",
          processData :   false,
          contentType :   false,
          success: function(){
              window.location = "uploadForm.jsp";
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-09
        • 2019-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多