使用commons-fileupload 1.2 进行文件上传!出现奇怪问题, 如果文件大于10K不报错,如果文件小于10K会报如下错误:
   ERROR StandardWrapperValve(invoke:278) - Servlet.service() for servlet PicAction threw exception
java.lang.ClassCastException: java.io.ByteArrayInputStream
at com.PicAction.doPost(PicAction.java:97)
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.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:595)servlet代码如下:
  
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html; charset=GBK");
PrintWriter out = response.getWriter();
try {

String docfilename = "";
long docsize = 0;
FileInputStream docstream = null; DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fu = new ServletFileUpload(factory); List fileItems; fileItems = fu.parseRequest(request); Iterator itr = fileItems.iterator(); fu.setSizeMax(4000000); // throw exception if > 4 Mb  System.out.println("TOTALFILES:" + fileItems.size()); while (itr.hasNext()) {
FileItem fi = (FileItem) itr.next();
if (!fi.isFormField()) {
// only process files here, not form fields
docfilename = fi.getName();
docsize = fi.getSize();
docstream = (FileInputStream) fi.getInputStream();---------如果小于10K就在这里出错 }
if (docsize > 0) {
 //略--把文件插入输入库 }
}
} catch (FileUploadException e) {
// TODO 自动生成 catch 块
System.out.println(e.toString());
}
}
请求解决方案! 谢谢!

解决方案 »

  1.   

    fileupload 要把
    FileInputStream转换为ByteArrayInputStream
    这里存在转换错误
      

  2.   

    写的一个方法给你借鉴一下
    public void copyBinaryFile(String strOldFilePath, String strNewFilePath) {
    File infile = new File(strOldFilePath);//要读取的文件(即输入).
    File outfile = new File(strNewFilePath);//要写入的文件(即输出).
    BufferedInputStream bufferreader = null;
    BufferedOutputStream bufferwrite = null;
    try {
    //读取文件的输入流与要读取的文件关联.
    bufferreader = new BufferedInputStream(new FileInputStream(infile));
    //写入文件的输出流与要写入的文件关联.
    bufferwrite = new BufferedOutputStream(
    new FileOutputStream(outfile));
    int c;//定义读取的标号.
    while ((c = bufferreader.read()) != -1)//没有到达文件的结尾处.
    {
    bufferwrite.write(c);//将读取的写入到目标文件.
    }
    System.out.println("File copy Success!");
    } catch (IOException ioe) {
    System.out.println("Exception:" + ioe.getMessage());
    } catch (Exception e) {
    System.out.println("Excepiton:" + e.getMessage());
    } finally {
    try {
    if (bufferreader != null) {
    bufferreader.close();//关闭进行读取的输入流.
    } } catch (Exception e) {
    System.out.println(e.getMessage());
    }
    try {
    if (bufferwrite != null) {
    bufferwrite.close();//关闭进行写入的输出流.
    } } catch (Exception e) {
    System.out.println(e.getMessage());
    }
    }
    }
      

  3.   

    to zhangshuling(张书玲)    这个好像和我的问题没太大关系啊! 我是使用common-fileupload时候出现该错误的!
      

  4.   

    docstream = (FileInputStream) fi.getInputStream();---------如果小于10K就在这里出错
    ====================================
    上传文件我是这样做的
    fi.write(new File("c:\\a.txt"));//c:\\a.txt为存放的上传文件
      

  5.   

    to zjf405(浪子阿飞)         我不是要存文件,我是直接把文件存入oracle数据库blob字段中!
      

  6.   

    ByteArrayOutputStream bs = getPictureBytes(文件绝对路径);
    bs.toByteArray()就是你要存入数据库的内容吧,不过我是MySql的数据库
      

  7.   

    不好意思哦,getPictureBytes忘了给,应该把它们整合在一起应该好看一些吧public static ByteArrayOutputStream getPictureBytes(String picPath) {
    ByteArrayOutputStream baos = null;
    try {
    File file = new File(picPath);
    FileInputStream fis = new FileInputStream(file);
    byte[] buffer = new byte[4096];
    //read input file stream into ByteArrayOutputStream object
    //then we can get the byte[] using the 'toByteArray' method
    //item.write(new File("c:\\"+item.getName()));
    int iLoop = 0;
    int i = 0;
    baos = new ByteArrayOutputStream();
    while ((i = fis.read(buffer, 0, 4096)) != -1) {
    baos.write(buffer, 0, i);
    iLoop = iLoop + i;
    }
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    return baos;
    }