如何通过multipart/form-data从j2me上传图片到服务器?

问题描述:

虽然我正在上传移动和应用程序编号的多部分来自移动数据,它是击中服务器和数据存储在数据库中。现在我添加捕获的图像,并发送到服务器它显示一个例外。如何通过multipart/form-data从j2me上传图片到服务器?

org.apache.commons.fileupload.FileUploadBase$UnknownSizeException: the request was rejected because its size is unknown 
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:305) 
    at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest (ServletFileUpload.java:116) 
    at org.apache.jsp.photo_jsp._jspService(photo_jsp.java:103) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:384) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266) 
    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) 

这里我发送手机和应用程序的号码和捕获的图像以字节(imagecapturephoto1)。捕获的图像在拍照后存储在视图中。但是当我们上传时显示异常。

try 
     { 
      System.out.println("url:" + serverUrl); 
     connection = (HttpConnection)Connector.open(serverUrl,Connector.READ_WRITE);       
       connection.setRequestMethod(HttpConnection.POST); 

     connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=*****"); 
     connection.setRequestProperty("User-Agent", "Profile/MIDP-2.1 Configuration/CLDC-1.1"); 
     connection.setRequestProperty("Accept", "application/octet-stream"); 

     writer = new DataOutputStream(connection.openDataOutputStream());    
     // writer =new DataOutputStream(conn.openOutputStream()); 
     String name="applicationNumber", name1="mobileNumber",name3="photo", 
       mimeType="text/plain",mimeType2="image/jpeg"; 

     String value="123456789", value1="9849765432",fileName="applicationphoto.jpeg"; 
       // write boundary   
       writeString(PREFIX); 
       writeString(boundary); 
       writeString(NEWLINE); 
       // write content header 
       writeString("Content-Disposition: form-data; name=\"" + name + "\""); 
       writeString(NEWLINE); 
       if (mimeType != null) 
       { 
        writeString("Content-Type: " + mimeType); 
        writeString(NEWLINE); 
       } 
       writeString("Content-Length: " + applicationNumber.length()); 
       writeString(NEWLINE); 
       writeString(NEWLINE); 
       // write content 
       writeString(applicationNumber);        
       writeString(NEWLINE);           

       // write boundary 
       writeString(PREFIX); 
       writeString(boundary);          
       writeString(NEWLINE);          
       // write content header 
       writeString("Content-Disposition: form-data; name=\"" + name1 + "\""); 
       writeString(NEWLINE); 
       if (mimeType != null) 
       { 
        writeString("Content-Type: " + mimeType); 
        writeString(NEWLINE); 
       } 
       writeString("Content-Length: " + mobileNumber.length());     
       writeString(NEWLINE);             
       writeString(NEWLINE);          
       // write content 
       writeString(mobileNumber);     
       writeString(NEWLINE); 

       //uploading image...........    
       // write boundary 
       writeString(PREFIX);        
       writeString(boundary);  
       writeString(NEWLINE);           
       // write content header 
       writeString("Content-Disposition: form-data; name=\"" + name3 
         + "\"; filename=\"" + fileName + "\""); 
       writeString(NEWLINE); 
       if (mimeType2 != null) 
       { 
        writeString("Content-Type: " + mimeType2); 
        writeString(NEWLINE); 
       } 
       writeString("Content-Length: " + imagecapturephoto1.length); 
       writeString(NEWLINE); 
       writeString(NEWLINE);      
       // write content 
       // SEND THE IMAGE 
       int index = 0; 
       int size = 1024; 
       do 
       {        
        System.out.println("write:" + index); 
        if((index+size)<=imagecapturephoto1.length) 
        { 
         writer.write(imagecapturephoto1, index, size); 
        } 

        index+=size; 
       }while(index<imagecapturephoto1.length); 
       writeString(NEWLINE); 


       writeString(PREFIX); 
       writeString(boundary); 
       writeString(PREFIX); 
       writeString(NEWLINE); 
       writer.flush(); 

       //writer.write("-- ***** -- \r\n".getBytes());     
       serverResponseMessage = connection.getResponseMessage(); 
       InputStream inputstream = connection.openInputStream(); 
       // retrieve the response from server 
       int chnumber; 
       StringBuffer sbuffer =new StringBuffer(); 
       while((chnumber= inputstream.read()) != -1) 
       { 
        sbuffer.append((char)chnumber); 
       } 
       String resonsestring=sbuffer.toString(); 
       int end=resonsestring.length(); 
       int tempstr=resonsestring.indexOf(">"); 

       statusResponse=resonsestring.substring(tempstr+1, end); 
       statusResponse="SUCCESS"; 
       //outputStream.close(); 
       writer.close(); 
       connection.close(); 
       return serverResponseMessage; 
      } 
      catch (Exception ex) 
      { 
       //statusResponse="SUCCESS"; 
       ex.printStackTrace(); 
       return null; 
      } 

请给我建议,我们怎么也得从去年10 days.please被击中从mobile.I上传图像建议我该如何解决这个问题。

在此先感谢。 -Teja。

请尝试下面的代码段,请忽略lat-lon编码。

private void postImageToServer(String curURL) throws Exception 
    { 
     // Open up a http connection with the Web server for both send and receive operations 

      midlet.get_frmLog().append("HttpConnection Enter"); 

      httpConnection = (HttpConnection)Connector.open(URL, Connector.READ_WRITE); 

      // Set the request method to POST 
      httpConnection.setRequestMethod(HttpConnection.POST); 
      // Set the request headers 
      httpConnection.setRequestProperty(ConstantCodes.ACTION_MODE_PARAMETER,action); 
      httpConnection.setRequestProperty(ConstantCodes.USER_NAME_REQUEST_PARAMETER,userName); 

      //httpConnection.setRequestProperty("lat","22.955804"); 
      //httpConnection.setRequestProperty("lon","72.685876"); 
      //httpConnection.setRequestProperty("lat",LatLonFetcherThread.getLatitude()); 
      //httpConnection.setRequestProperty("lon",LatLonFetcherThread.getLongitude()); 

      /*lat = "23.0172"; 
      lon = "72.3416";*/ 

      if (midlet.get_choiceGroupGPS().getSelectedIndex() == 0) 
      { 
       lat = LatLonFetcherThread.getLatitude(); 
       lon = LatLonFetcherThread.getLongitude(); 
      } 
      else if (midlet.get_choiceGroupGPS().getSelectedIndex() != 0) // Added By KALPEN 
      { 
       if (midlet.state == mREPORTER.STATE_READING) 
       { 
        double xLat,xLon; 
        try 
        { 
         GpsBt.instance().start(); 
         //while (true) 
         { 
          gpsBt = GpsBt.instance(); 
          if (gpsBt.isConnected()) 
          { 
           location = gpsBt.getLocation(); 

           //lat = location.utc; 
           //lon = location.utc; 

           lat = (location.latitude + location.northHemi); 
           lon = (location.longitude + location.eastHemi); 

           lat = lat.substring(0,lat.length()-1); 
           lon = lon.substring(0,lon.length()-1); 

           xLat = Double.parseDouble(lat)/(double)100.00; 
           xLon = Double.parseDouble(lon)/(double)100.00; 

           lat = xLat + ""; 
           lon = xLon + ""; 

           lat = lat.substring(0,7); 
           lon = lon.substring(0,7); 

           //lat = "23.0172"; 
           //lon = "72.3416"; 

          } 
          Thread.sleep(100); 
         } 
        } 
        catch (Exception e) { lat = "23.0172"; lon = "72.3416"; } 
       } 
      } 

      httpConnection.setRequestProperty("lat",lat); // Modifed by KALPEN 
      httpConnection.setRequestProperty("lon",lon); // Modifed by KALPEN 

      //String latlongStr = "Latitude: " + LatLonFetcherThread.getLatitude() 
      //  + "\nLongitude: " + LatLonFetcherThread.getLongitude(); 
      /*String latlongStr = "lat: 22.955804" + "lon: 72.685876";*/ 

      //#style screenAlert 
      /*Alert latlonAlert = new Alert("LatLon alert"); 
      latlonAlert.setString(latlongStr); 
      mREPORTER.display.setCurrent(latlonAlert);*/ 

      if(eventName == null || eventName.equals("")) 
       eventName = "default"; 

      // all the headers are sending now and connection channel is establising 
      httpConnection.setRequestProperty(ConstantCodes.EVENT_NAME_REQUEST_PARAMETER, eventName); 
      httpConnection.setRequestProperty(ConstantCodes.CAMERAID_REQUEST_PARAMETER, cameraID); 
      httpConnection.setRequestProperty(ConstantCodes.COMPRESSION_MODE_REQUEST_PARAMETER, compressionMode); 


      midlet.get_frmLog().append("Write on server-->"+imageBytes.length); 

      DataOutputStream dos = httpConnection.openDataOutputStream(); 
      dos.write(imageBytes); 
      midlet.threadFlag=true; 
     } 

以上方法对我的代码正常工作,因为我也试图上传图像到服务器。

+0

在上面的代码中writeString(s);我使用了相同的代码public void writeString(String s)throws java.io.IOException { byte [] b = s.getBytes(); Writer.write(b,0,b.length); writer.write(b,0,b.length); }当我发送图像数据的多部分form-data.So我用上面的代码发送image.It是显示未知的大小异常。 – Teja

+0

亲爱的泰雅,上传图片时还需要指定图片的大小。 – Lucifer

+0

嗨Kalpen, 在上面的代码中我提到大小为writeString(“Content-Length:”+ imagecapturephoto1.length);. imagecapturephoto1是以字节为单位拍摄的图像。 – Teja