0

我以前在 tomcat 5.5 中使用 jupload,效果很好!现在我的任务是将 tomcat 升级到版本 7(确切地说是 7.0.70),并发现 jupload 不再有效。我没有改变一点代码。唯一改变的是tomcat distr,(我什至在服务器xml上使用了相同的连接器定义)所以这是我的代码jsp页面

<%@ page language="java" contentType="text/html; charset=cp1251"
    pageEncoding="cp1251"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page session="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=cp1251">
<title>Загрузка файлов</title>
<link rel=stylesheet type="text/css" href="/styles/style.css">
<style>
.td {
    valign: top
}
</style>
</head>
<body style="background-color: white;">
    <APPLET CODE="wjhk.jupload2.JUploadApplet" NAME="JUpload"
        ARCHIVE="${pageContext.request.contextPath}/applets/lib/jupload.jar"
        WIDTH="640" HEIGHT="300" MAYSCRIPT
        ALT="The java pugin must be installed.">
        -
        <c:choose>
            <c:when test="${param.par_type==1}">
                <param name="postURL"
                    value="${pageContext.request.contextPath}/protected/MultipleFileUpload?par_type=1" />
            </c:when>
            <c:when test="${param.par_type==2}">
                <param name="postURL"
                    value="${pageContext.request.contextPath}/protected/MultipleFileUpload?par_type=2" />
            </c:when>
            <c:when test="${param.par_type==3}">
                <param name="postURL"
                    value="${pageContext.request.contextPath}/protected/MultipleFileUpload?par_type=3" />
            </c:when>
            <c:otherwise>
                <param name="postURL"
                    value="${pageContext.request.contextPath}/protected/MultipleFileUpload" />
            </c:otherwise>
        </c:choose>
        <param name="afterUploadURL"
            value="${pageContext.request.contextPath}/protected/MultipleFileUpload" />
        <param name="allowedFileExtensions" value="xml/osf/zsf/plax" />
        <param name="afterUploadURL"
            value="javascript:alert('Загрузка файлов успешно завершена');window.opener.location.href = '../protected/sheet/plan/EducPlansStorage';window.close();" />
        <param name="showLogWindow" value="true" />
        <param name="debugLevel" value="0" />
        <param name="stringUploadSuccess" value="^SUCCESS" />
        <param name="lookAndFeel" value="system" />
    </APPLET>
</body>
</html>       

服务器端 MultipleFileUpload Servlet

  package com.ieml.servlets.plan;

    import java.io.*;
    import java.sql.*;
    import java.util.*;

    import javax.servlet.*;
    import javax.servlet.http.*;

    import org.apache.commons.fileupload.*;

    import org.apache.commons.fileupload.disk.*;
    import org.apache.commons.fileupload.servlet.*;

    import com.ieml.Global;
    import com.ieml.util.*;

    /**
     * Servlet implementation class for Servlet: UploadInfoFileServlet
     *
     */
    public class MultipleFileUploadServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
        private static final long serialVersionUID = 1L;

        protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }   

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }   

        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        {
            PrintWriter out = response.getWriter();
            String path = com.ieml.Global.getUploadDirectory();
            Integer type= ServletUtilities.getIntParameter(request, "par_type");
            if(path == null)
            {
                ServletUtilities.forwardErrorPage(request, response, "Не указано место хранения файлов");           
                return;         
            }
            if(type==null)
            {
                ServletUtilities.forwardErrorPage(request, response, "Не указан тип плана");            
                return;         
            }
            else
            {
                switch(type)
                {
                case 1:path+="/plans/incoming/"; break;
                case 2:path+="/plansMag/incoming/";break;
                case 3:path+="/plansSPO/incoming/";break;
                }
            }

            boolean isMultipart = ServletFileUpload.isMultipartContent(new ServletRequestContext(request));

            if (isMultipart) 
            {
                try
                {
                    FileItemFactory factory = new DiskFileItemFactory();
                    ServletFileUpload upload = new ServletFileUpload(factory);
                    upload.setHeaderEncoding("UTF-8");
                    List<?> items = upload.parseRequest(request);
                    Iterator<?> iter = items.iterator();
                    while(iter.hasNext())
                    {
                        FileItem item = (FileItem)iter.next();                
                        if (!item.isFormField()) 
                        {
                            String fileName = item.getName();
                            if(!fileName.endsWith(".xml") &&!fileName.endsWith(".XML") &&
                                    !fileName.endsWith(".osf") && !fileName.endsWith(".OSF") &&
                                    !fileName.endsWith(".zsf") && !fileName.endsWith(".ZSF")&&
                                    !fileName.endsWith(".plax") && !fileName.endsWith(".PLAX")
                                    )
                            {
                                ServletUtilities.forwardErrorPage(request, response, "Поддерживаемые формат файлов: .xml");
                                return;         
                            }
                            Connection conn = Global.getConnection();                   
                            try {

                                File f = new File(path,   fileName);
                                if(f.exists()) f.delete();                    

                                File uploadedFile = new File(path, fileName);
                                try
                                {
                                    item.write(uploadedFile);
                                }
                                catch(Exception e)
                                {
                                    e.printStackTrace();
                                    log(e.getMessage());
                                    ServletUtilities.forwardErrorPage(request, response, "Не могу записать файл.");
                                }
                            }                   
                            finally
                            {
                                conn.close();
                            }
                            break;
                        }
                    }
                    out.println("SUCCESS");
                }
                catch(SQLException e){
                    e.printStackTrace();
                }
                catch(FileUploadException fue){
                    fue.printStackTrace();
                    log(fue.getMessage());
                    ServletUtilities.forwardErrorPage(request, response, "Не могу принять файл.");              
                }
            }   
        }
    }  

这是我的错误http://pastebin.com/xUaSjKdV的 jupload 日志

在我看来,在 jupload 开始准备上传后,由于某种原因它重定向到 Web 应用程序根目录(这反过来又被重定向到需要登录的网站的受保护区域)在这两种情况下,用户在进入 jsp 时已经登录页。.所以出于某种奇怪的原因,只是在登录页面中搜索成功字符串,当然不包含它,所以会弹出错误。我想知道为什么它首先重定向到网络应用程序根目录。我认为这可能与超时问题有关,将 asyncTimeout 的默认参数更改为“6000(根据文档,此参数在 5.5 版本中不存在)但仍然没有运气。这是我在 localhost 上的基本端口 8080 Connecto在tomcat上

 <Connector  acceptCount="100"  protocol="org.apache.coyote.http11.Http11Protocol" connectionTimeout="20000" disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192" maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="8080" redirectPort="8443"/>

有任何想法吗?

4

1 回答 1

0

我终于弄明白了,让它工作的唯一方法就是将 useHttpOnly="false" 添加到我的 context.xml 文件中,所以它看起来像 < Context useHttpOnly="false" > 希望这对其他人也有帮助

于 2016-08-16T04:46:33.240 回答