如何在使用HDIV的网站中检索使用Ajax上传的多部分文件?

时间:2015-06-16 07:30:43

标签: java javascript ajax hdiv

我们在Tomcat 7.0.27上运行了一个网站,我们使用以下Ajax JavaScript代码在我们的网站上动态上传图像:

var fileInput = document.getElementById("uploadfile");
var formData = new FormData();
formData.append("uploadfile", fileInput.files[0]);

$.ajax({
   url: '<c:url value="/something/PhotoUpload"/>',
   type: 'POST',
   data: formData,
   async: true,
   cache: false,
   dataType: 'json',
   processData: false, // Don't process the files
   contentType: false, // Set content type to false as jQuery will tell the server its a query string request
   success: function(data, textStatus, jqXHR)
   {
        // do something;    
   },
   error: function(jqXHR, textStatus, errorThrown)
   {
       // Handle errors here
   }
});

服务器端是一个具有以下post方法的servlet:

@MultipartConfig
public class PhotoUploadAjaxServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part part = request.getPart("uploadfile");
        if (part != null) {
             //Process image
        }
    }
}

这一切都很棒,“part”包含我们上传的文件。我们添加了HDIV库以防止一些安全漏洞,现在“部分”突然变为空。我无法弄清楚原因。

应用程序的其余部分使用Struts 1.2.7,该部分受HDIV保护,但/ PhotoUpload url不受保​​护,因此HDIV根本不应该触及请求。这是hdiv-config.xml:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:hdiv="http://www.hdiv.org/schema/hdiv"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.hdiv.org/schema/hdiv http://www.hdiv.org/schema/hdiv/hdiv.xsd">

<hdiv:config errorPage="/InternalError.do" excludedExtensions="css,png,gif,jpeg,jpg,js"
    protectedExtensions="/something/*.do, /something/*.action" maxPagesPerSession="20" confidentiality="true"
    avoidValidationInUrlsWithoutParams="true" reuseExistingPageInAjaxRequest="true">
    <hdiv:sessionExpired homePage="/" />
    <hdiv:startPages>/Login.do</hdiv:startPages>
    <hdiv:startPages>/LoginSubmit.do</hdiv:startPages>
    <hdiv:startPages>/InternalError.do</hdiv:startPages>
    <!-- Some things removed to protect the innocent -->
    <hdiv:startParameters>org.apache.struts.action.TOKEN,org.apache.struts.taglib.html.TOKEN</hdiv:startParameters>

</hdiv:config>

</beans>

我注意到的一个奇怪的事情是:当上传的图像足够大时 - 例如3MB - 尽管HDIV,整个过程仍然有效。 “part”包含文件就像它应该的那样。在日志中我看到了:

 org.hdiv.config.multipart.StrutsMultipartConfig:79 - Size limit exceeded exception

因此,我认为当多部分数据存储在内存中时,HDIV会以某种方式错误配置。一旦数据大小足够大,数据就会存储在文件系统中,然后就能正常工作。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您必须使用Struts操作处理该文件,而不是使用自定义servlet处理该文件。

您可以看到示例here