2013-02-26 5 views
0

Я пытаюсь загрузить некоторый файл изображения в мою базу данных. Когда я запускаю свой код, он производит ошибку java.lang.IndexOutOfBoundsException:. Но тот же код хорошо работает в другой форме.Не удается загрузить изображение на сервер java.lang.IndexOutOfBoundsException:

Мой код:

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

    PrintWriter out = response.getWriter(); 
    String uname = (String) request.getSession().getAttribute("uname"); 
    //set content type 
    response.setContentType("text/html"); 

    DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(); 

    fileItemFactory.setSizeThreshold(1*1024*1024); //1 MB 

    ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory); 
    try { 
      if (! ServletFileUpload.isMultipartContent(request)) { 
      System.out.println("sorry. No file uploaded"); 
      return; 
     } 

     // parse request 
     List<?> items = uploadHandler.parseRequest(request); //getting error 
     System.out.println(items.size()); 
     // get uploaded file 
     FileItem file = (FileItem) items.get(0); 

       Connection con=prepareConnection(); 
       con.setAutoCommit(false); 

       //Part photo=request.getPart("photo"); 
       BufferedImage originalImage=ImageIO.read(file.getInputStream()); 
       int type = originalImage.getType() == 0? BufferedImage.TYPE_INT_ARGB : originalImage.getType(); 
       BufferedImage resizeImageJpg = resizeImage(originalImage, type); 
       ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
       ImageIO.write(resizeImageJpg, "png", baos); 
       baos.flush(); 
       InputStream is = new ByteArrayInputStream(baos.toByteArray()); 

       StringBuilder sb=new StringBuilder(1024); 
       sb.append("insert into ").append(uname).append("PROFILEPICTURE values(?,?)"); 
       String query = sb.toString(); 
       PreparedStatement ps = con.prepareStatement(query); 
       ps.setInt(1, 1); 
       ps.setBinaryStream(2, is); 

       int i=ps.executeUpdate(); 
       con.commit(); 
       con.close(); 

       if(i==1) 
       { 
       RequestDispatcher dispatcher = request.getRequestDispatcher("/sp/profile"); 
       if(dispatcher != null) { 
        dispatcher.forward(request, response); 
       } 
       } 
       else 
       { 
        out.println("Error ocuured"); 
       } 
      out.close(); 

     } 
     catch(Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

Консоль вывода:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
at java.util.ArrayList.rangeCheck(Unknown Source) 
at java.util.ArrayList.get(Unknown Source) 
at skypark.AddProfilePict.doPost(AddProfilePict.java:79) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:931) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

И моя форма:

<form id="form" method="post" action="AddProfilePict" enctype="multipart/form-data"> 
    <input type="file" accept="image/*" style="width: 450px; border:0px; background:none; margin-top:5px; width:245px;" value=""> 
<input class="upld" type="submit" value="Upload"> 
</form> 

Может кто-нибудь помочь мне понять, что вызывает ошибку?

+0

'' деталей является пустой список, так что вы не можете получить доступ к 'items.get (0) ; '. Как вы отправляете файл на сервер? Не пытайтесь использовать вызов ajax. –

+0

@Luiggi Mendoza Я не звоню в ajax. Я передаю данные обычным способом ... – james

+0

Можете ли вы отправить полный образец, чтобы воспроизвести проблему? –

ответ

0

items действительно должно быть пустым. Вы должны сначала проверить его длина, а затем попытаться извлечь элементы с помощью

if(! items.isEmpty()) { 
    FileItem file = (FileItem) items.get(0); 
} 

или

if(items.size() > 0) { 
    FileItem file = (FileItem) items.get(0); 
} 
+0

Можете ли вы сказать мне, почему «Список items = uploadHandler.parseRequest (запрос);' return '0', когда я печатаю' items' – james

+0

@james Убедитесь, что файл загружается отвечают требованиям размера. – mtk

Смежные вопросы