upload.jsp <%@ page language="java" contentType="text/html; charset=gbk" 
  pageEncoding="gbk"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gbk"> 
<title>Insert title here </title> 
<script type="text/javascript"> 
        var xmlHttp; 
        //创建XMLhttpRequest对象 
        function createXMLHttpRequest() { 
            if (window.ActiveXObject) { 
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
            } 
            else if (window.XMLHttpRequest) { 
                xmlHttp = new XMLHttpRequest(); 
            } 
        }         //生成传递到服务器的参数查询串,参数值由页面表单填写得到 
      function createQueryString() { 
            var firstName = document.getElementById("firstName").value; 
            var queryString = "firstName=" + firstName + ""; 
            return queryString; 
        } 
      //点击按钮响应的POST方法主函数 
        //POST方法把参数值以名=值方式在xmlHttp.send(queryString)中传递,queryString的形式为参数名=值&参数名=值...; 
        function doRequestUsingPOST() { 
            createXMLHttpRequest();//第一步:创建XMLHttpRequest对象 
            var url = "fff"; 
            var queryString = createQueryString();//第二步:定义传递的参数值字符串 
            xmlHttp.open("POST", url, true);//第三步:建立与服务器的请求 
            xmlHttp.onreadystatechange = handleStateChange;//第四步:监听状态-->转到监听状态函数 
            xmlHttp.setRequestHeader("Content-Type","multipart/form-data;"); 
            xmlHttp.send(null);//第五步:发送请求,并且立即返回 
        }         //监听状态函数 
        function handleStateChange() { 
            if(xmlHttp.readyState == 4) { 
                if(xmlHttp.status == 200) { 
                parseResults();//-->转到函数parseResults输出从服务器返的值 
                } 
            } 
        }         //在页面显示从服务器传来的结果 
      function parseResults() { 
            var responseDiv = document.getElementById("serverResponse"); 
            if(responseDiv.hasChildNodes()) { 
            responseDiv.removeChild(responseDiv.childNodes[0]); 
        } 
        var responseText = document.createTextNode(xmlHttp.responseText);// 
        responseDiv.appendChild(responseText); 
        } 
</script> 
</head> 
<body> <input type="file" size="30" id="firstName" name="test" /> 
<input name="up" type="button" onclick="doRequestUsingPOST();" value="上传" /> 
<div id="serverResponse"> </div> </body> 
</html> UploadFile.java public class UploadFile extends HttpServlet {     protected void processRequest(HttpServletRequest request, 
            HttpServletResponse response, String method) 
            throws ServletException, IOException { 
    
        final long MAX_SIZE = 3 * 1024 * 1024; final String[] allowedExt = new String[] { "jpg","gif" }; 
response.setContentType("text/html;charset=gbk"); response.setCharacterEncoding("gbk"); 
DiskFileItemFactory dfif = new DiskFileItemFactory(); 
dfif.setSizeThreshold(4096); 
dfif.setRepository(new File(request.getRealPath("/") 
+ "ImagesUploadTemp")); 
ServletFileUpload sfu = new ServletFileUpload(dfif); sfu.setSizeMax(MAX_SIZE); PrintWriter out = response.getWriter(); List fileList = null; 
try { 
fileList = sfu.parseRequest(request); 
} catch (FileUploadException e) { 
if (e instanceof SizeLimitExceededException) { 
out.println("请选择小于等于:" + MAX_SIZE + "的文件 <p />"); 
out.println(" <a href=\"upload.html\" target=\"_top\">返回 </a>"); 
return; 

e.printStackTrace(); 
} if (fileList == null || fileList.size() == 0) { 
out.println("11"); 
out.println(" <a href=\"upload.html\" target=\"_top\">返回 </a>"); 
return; 

Iterator fileItr = fileList.iterator(); while (fileItr.hasNext()) { 
FileItem fileItem = null; 
String path = null; 
long size = 0; fileItem = (FileItem) fileItr.next(); 
if (fileItem == null || fileItem.isFormField()) { 
continue; 

path = fileItem.getName(); 
size = fileItem.getSize(); 
if ("".equals(path) || size == 0) { 
out.println("你选择的文件不正确 "); 
out.println(" <a href=\"upload.html\" target=\"_top\">返回 </a>"); 
return; 

String t_name = path.substring(path.lastIndexOf("\\") + 1); 
String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1); 
int allowFlag = 0; 
int allowedExtCount = allowedExt.length; 
for (; allowFlag < allowedExtCount; allowFlag++) { 
if (allowedExt[allowFlag].equals(t_ext)) 
break; 

if (allowFlag == allowedExtCount) { 
out.println("支撑的文件格式 <p />"); 
for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++) 
out.println("*." + allowedExt[allowFlag] 
  + "&nbsp;&nbsp;&nbsp;"); 
  out.println(" <p /> <a href=\"upload.html\" target=\"_top\">返回 </a>"); 
return; 

long now = System.currentTimeMillis(); 
String prefix = String.valueOf(now); 
String u_name = request.getRealPath("/") + "ImagesUploaded/" 
+ prefix + "." + t_ext; 
try { fileItem.write(new File(u_name)); 
out.println("文件名称: " + prefix + "." + t_ext 
+ " &nbsp;&nbsp;文件大小: " + size + " <p />"); 
out.println(" <a href=\"upload.html\" target=\"_top\">返回 </a>"); 
} catch (Exception e) { 
e.printStackTrace(); 


                out.println("123"); 
                out.close(); 
            } 
            protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
                //Get主函数调用processRequest,完成Get方法的参数接受,返回的过程 
                processRequest(request, response, "GET"); 
            } 
            protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
                //POST主函数调用processRequest,完成POST方法的参数接受,返回的过程 
                processRequest(request, response, "POST"); 
            } 

报的错误 
org.apache.commons.fileupload.FileUploadException: the request was rejected because no multipart boundary was found 
at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl. <init>(FileUploadBase.java:814) 
at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:323) 
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:341) 
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126) 
at UploadFile.processRequest(UploadFile.java:47) 
at UploadFile.doPost(UploadFile.java:124) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445) 
at java.lang.Thread.run(Unknown Source) 我 就是 想把他 改成 ajax 的 不 知道 怎么 改 

解决方案 »

  1.   

    <s:form action="upload" theme="simple" enctype="multipart/form-data"> 
       .......
    </s:form>
    Stuts2中上传文件,form的 enctype 要设成, enctype="multipart/form-data" 才可以, 楼主再试试
      

  2.   

    Ajax 是无法直接处理带附件的POST请求的,需要使用一些第三方的组件或者自己用iframe实现
      

  3.   

    //POST方法把参数值以名=值方式在xmlHttp.send(queryString)中传递,queryString的形式为参数名=值&参数名=值...;  
      function doRequestUsingPOST() {  
      createXMLHttpRequest();//第一步:创建XMLHttpRequest对象  
      var url = "fff";  
      var queryString = createQueryString();//第二步:定义传递的参数值字符串  
      xmlHttp.open("POST", url, true);//第三步:建立与服务器的请求  
      xmlHttp.onreadystatechange = handleStateChange;//第四步:监听状态-->转到监听状态函数  
      xmlHttp.setRequestHeader("Content-Type","multipart/form-data;");  
      xmlHttp.send(null);//第五步:发送请求,并且立即返回  
      }  
    请问,上面的代码里头,我看见post方法中,发送请求时,参数为null.您没有传递参数过去,后面怎么获得的?是用form的提交吗?<s:form action="upload" theme="simple"enctype="multipart/form-data">
    这个是您的form头吗?
    我的是:<form  name="form" action="javascript:dosss();" enctype="multipart/form-data">我直接用表单提交可以实现,但是用这种方法,servlet处理完之后,必须得跳转,只能用ajax.
    <script type="text/javascript">
     //统计资源访问次数的脚本
     //定义XMLHttpRequest对象
     var http_request1=false;
     function send_request1(url){
         http_request1=false;
         //开始初始化XMLHttpRequest对象
         if(window.XMLHttpRequest){//Mozilla等浏览器初始化XMLHttpRequest过程
             http_request1=new XMLHttpRequest();
             //有些版本的Mozilla浏览器处理服务器返回的未包含XML mime-type头部信息的内容时会出错.
             //因此,要确保返回的内容包含text/xml信息.
             if(http_request1.overrideMimeType){
                 http_request1.overrideMimeType("text/xml");
             }
         }
         else if(window.ActiveXObject){//IE浏览器初始化XMLHttpRequest过程
             try{
                 http_request1=new ActiveXObject("Msxml2.XMLHTTP");
             }
             catch(e){
                 try{
                     http_request1=new ActiveXObject("Microsoft.XMLHTTP");
                 }
                 catch(e){}
             }
         }
         //异常,创建对象失败
         if(!http_request1){
             window.alert("不能创建XMLHttpRequest对象实例!");
             return false;
         }
         //指定响应处理函数
         http_request1.onreadystatechange=ps;
         //发送HTTP请求信息
         http_request1.open("POST",url,true);

        http_request1.setRequestHeader("Content-Type","multipart/form-data");
         //将参数放到这里,后台servlet可以用request.getParameter()方法取到这些参数
         var firstName = document.getElementById("firstName").value;  
      var queryString = "firstName=" + firstName + "";       http_request1.send(firstName); }
     //处理返回信息函数
     function ps() {
     if(http_request1.readyState==4){
             //判断HTTP状态码
             if(http_request1.status==200){
                 //信息已经成功返回,无动作
             }
             else { 
             }
         }
    }
     function dosss(){
        send_request1("/m/upload"); //这里的rewriteUrl就是页面上放置的资源经过重写后的链接
     }
    </script>servlet跟您的一样,请指教。