//此处是下载
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
//得到下载文件的名字
String filename=request.getParameter("filename");
//解决中文乱码问题
         filename=new String(request.getParameter("filename").getBytes("iso-8859-1"),"gbk");
         
       //创建file对象
         File file=new File("E://gongzuo//apache-tomcat-6.0.30//temp//"+filename);
       //设置response的编码方式
         response.setContentType("application/x-msdownload");
         
       //写明要下载的文件的大小
         response.setContentLength((int)file.length());
         //设置附加文件名
        response.setHeader("Content-Disposition","attachment;filename="+filename);
        
      //解决中文乱码
        response.setHeader("Content-Disposition","attachment;filename="+new String
     
        (filename.getBytes("gbk"),"iso-8859-1"));        
        
      //读出文件到i/o流
        FileInputStream fis=new FileInputStream(file);
        BufferedInputStream buff=new BufferedInputStream(fis);
 
        byte [] b=new byte[1024];//相当于我们的缓存
 
        long k=0;//该值用于计算当前实际下载了多少字节
 
        //从response对象中得到输出流,准备下载
 
        OutputStream myout=response.getOutputStream();
 
        //开始循环下载
 
        while(k<file.length()){
            int j=buff.read(b,0,1024);
            k+=j;
            //将b中的数据写到客户端的内存
            myout.write(b,0,j);
        }
        //将写入到客户端的内存的数据,刷新到磁盘
        myout.flush();         
         
        

out.flush();
out.close();
}//上传 
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
response.setCharacterEncoding("utf-8");//响应消息内容能够正常显示中文
request.setCharacterEncoding("utf-8");//请求信息时
String filename="";//文件名称
String filepath="";//文件路径
String fileDosc="";//文件描述
long fileSize=0;//文件的大小
//创建文件上传的对象。借助 common-fileupload.jar
DiskFileItemFactory disk=new DiskFileItemFactory();//
long maxsize=1024*1024*5;//设置上传文件最大为5M
disk.setSizeThreshold(5102);//为上传文件在缓冲中设置一个大小为5K
String tmpFile=this.getServletContext().getRealPath("/");//获取上传路径
System.out.println(tmpFile);
File filo=new File(tmpFile+"tmpFile");//保存上传文件的目录
if(!filo.exists()){
filo.mkdirs();//服务器上是否有上传文件路径的目录如果没有则创建
}
disk.setRepository(filo);//将上传文件的目录加入到硬盘对象中

//创建能够解析上传文件的2进制类 由common-fileupload 与 io提供
ServletFileUpload sfu=new ServletFileUpload(disk);
sfu.setSizeMax(maxsize);//设置上传文件的最大容量
List list=null;
try{
list=sfu.parseRequest(request);//完成对上传文件的解析 同时将解析后的内容放到list里

}catch(Exception e){
out.println("<script  language='javascript'>");
out.print("alert('上传文件失败')");
out.println("</script>");

}
//遍历list对象中的内容 完成将上传文件保存到服务器中
Iterator iterator=list.iterator();
int n=0;//控制文本域中上传的次数
while(iterator.hasNext()){//遍历迭代器中的内容
FileItem fileitem= (FileItem) iterator.next();//next返回的objc的类型要强转fileitem是上传文件的内容
n++;
if(fileitem.isFormField()){//判断上传内容是普通文本域还是一个文件域 例如表述是文本
fileDosc=fileitem.getString("utf-8");//获取普通文本域的值
}
if(!fileitem.isFormField()){//判断文件域
filename="";
filename=fileitem.getName();//获取上传文件的名称
filepath="tmpFile";//上传文件的相对路径
fileSize=fileitem.getSize();//获取文件大小

if(!"".equals(filename)){//判断文件是否存在
//定义输出流

// tmpFile路径     filepath文件目录       filename文件名 上传到服务的路径
FileOutputStream fileOut=new FileOutputStream(tmpFile+filepath+"\\"+filename);
System.out.println(filename);
if(!fileitem.isInMemory()){//如果上传文件在缓冲区那就直接上传
try{
fileOut.write(fileitem.get());
out.println("<script  language='javascript'>");
out.print("alert('上传文件成功')");
out.print("window.location.href='file.jsp'");
out.println("</script>");
}catch(Exception e){
out.println("<script  language='javascript'>");
out.print("alert('上传文件失败')");
out.print("window.location.href='file.jsp'");
out.println("</script>");
}finally{
fileOut.close();
}
}else{
//如果上传的文件不在缓冲区 进行标准的IO流操作
InputStream  input= fileitem.getInputStream();
try{


int i=-1;//文件是否传输结束的标记
byte[] bt=new byte[1024*2];
i=input.read(bt);//读取上传文件的二进制流
while(i!=-1){
fileOut.write(bt,0,i);//写入到服务器
i=input.read(bt);

out.println("<script  language='javascript'>");
out.print("alert('上传文件成功')");
out.print("window.location.href='file.jsp'");
out.println("</script>");

}
}catch(Exception e){
out.println("<script  language='javascript'>");
out.print("alert('上传文件失败')");
out.print("window.location.href='file.jsp'");
out.println("</script>");

}finally{
input.close();
fileOut.flush();
fileOut.close();
}
}
}
}

}



out.flush();
out.close();
}报出同一个错  请各位大虾指点一二啊! 小弟在此谢过啦!错误报告   
getWriter() has already been called for this response
at org.apache.catalina.connector.Response.getOutputStream(Response.java:580)
at org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:183)
at com.accp.shang.FileDownServlet.doPost(FileDownServlet.java:86)
at com.accp.shang.FileDownServlet.doGet(FileDownServlet.java:38)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
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:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
      
页面错误报告
java.lang.IllegalStateException: getWriter() has already been called for this response
org.apache.catalina.connector.Response.getOutputStream(Response.java:580)
org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:183)
com.accp.shang.FileDownServlet.doPost(FileDownServlet.java:86)
com.accp.shang.FileDownServlet.doGet(FileDownServlet.java:38)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

解决方案 »

  1.   

    java.lang.IllegalStateException: getWriter() has already been called for this response
    意思是说“getWriter()”这个函数只允许被调用一次。
    你在FileDownServlet.doGet()函数中调用了doPost(),是否在doGet()函数中你已经执行过一次getWriter()了?
      

  2.   

    PrintWriter out = response.getWriter();
    OutputStream myout=response.getOutputStream();
    是不是这两个冲突了....你去掉一个试试
      

  3.   

    getWriter()”这个函数只允许被调用一次
      

  4.   

    你是用struts开发的还是用什么开发的啊 
      

  5.   

    这是两个servlet   上传的servlet
    if(!fileitem.isInMemory()){//如果上传文件在缓冲区那就直接上传
    这句话有问题我改了if(fileitem.isInMemory()){//
    可是还是没有办法上传
    可是 下载的那个servlet 里只有一个 myout.write(b,0,j); 
    为什么会多次调用呢?请各位大侠指教!
      

  6.   

    多次调用是指你多次调用response去获取输出接口,在你下载的Servlet中就是:PrintWriter out = response.getWriter(); // 第一次
    OutputStream myout=response.getOutputStream(); // 第二次
      

  7.   

    PrintWriter out = response.getWriter();
    去掉就可以了