使用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());
}
}
请求解决方案! 谢谢!
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());
}
}
请求解决方案! 谢谢!
FileInputStream转换为ByteArrayInputStream
这里存在转换错误
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());
}
}
}
====================================
上传文件我是这样做的
fi.write(new File("c:\\a.txt"));//c:\\a.txt为存放的上传文件
bs.toByteArray()就是你要存入数据库的内容吧,不过我是MySql的数据库
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;
}