限制上传的特定文件扩展名(服务器端)

时间:2014-06-11 13:40:43

标签: java filter

自从过去两天以来,我正在研究以下情况, 我开发了一个java过滤器,检查请求是否是多部分类型,       如果是,我想限制.php文件上传。 在servlet过滤器中,我成功检索了文件类型,如果它是有效的,我已转发该请求继续。 现在我的业务逻辑在没有过滤器的情况下工作正常,现在无法上传。 我的项目是使用Spring框架。 在业务逻辑上,我使用MultipartRequest(弹簧类)作为投射。 调用request.getFileNames(),它在涉及过滤器之后不返回任何内容。

在过滤器中,我在验证文件扩展名后包装了请求,如下所示: 所有表单字段都在参数映射中设置,将随请求一起传递。 并且文件类型字段在请求对象中设置为属性。

你能帮忙吗?

谢谢, Namrata Shah

3 个答案:

答案 0 :(得分:0)

doFilter()

我已经检查过收到的请求是否是HttpServletRequest的实例。如果是,那么如果它是使用以下代码的多部分请求,它将被解析:

parseRequest():

{

List<FileItem> multipartItems = null;
        try
        {   multipartItems = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        }
        catch (FileUploadException e)
        {
            throw new ServletException("Cannot parse multipart request: " + e.getMessage());
        }

        Map<String, String[]> parameterMap = new HashMap<String, String[]>();
        for (FileItem multipartItem : multipartItems)
        {
            if (multipartItem.isFormField())
            processFormField(multipartItem, parameterMap);
            else
            processFileField(multipartItem, request);
        }
            return wrapRequest(request, parameterMap);
}

答案 1 :(得分:0)

processFormField()的代码:

 String name = formField.getFieldName(),value = formField.getString();
 String[] values = parameterMap.get(name);

 if (values == null)
 {
     parameterMap.put(name, new String[]{value});
 }
 else
 {
     int length = values.length;
     String[] newValues = new String[length + 1];
     System.arraycopy(values, 0, newValues, 0, length);
     newValues[length] = value;
     parameterMap.put(name, newValues);
 }

答案 2 :(得分:0)

processFileField()的代码:

request.setAttribute(fileField.getFieldName(), fileField);

然后,我将请求包装如下:

private static HttpServletRequest wrapRequest(
            HttpServletRequest request, final Map<String, String[]> parameterMap)
    {

        return new HttpServletRequestWrapper(request)
        {
            @Override
            public Map<String, String[]> getParameterMap()
            {
                return parameterMap;
            }

            public String[] getParameterValues(String name)
            {
                return parameterMap.get(name);
            }

            public String getParameter(String name)
            {
                String[] params = getParameterValues(name);
                return params != null && params.length > 0 ? params[0] : null;
            }

            public Enumeration<String> getParameterNames()
            {
                return Collections.enumeration(parameterMap.keySet());
            }
        };
    }