2010-07-10 10 views
0

J'essaie d'afficher une image jpg sur un serveur Web. J'ai testé mon script PHP sur le serveur et je suis en mesure de télécharger une image en utilisant un formulaire. Maintenant j'essaie de faire une application Blackberry pour POSTER l'image sur le serveur en utilisant le même script mais quand je teste le code Java, PHP me dit que RIEN n'a été POSTé, je ne suis pas sûr de ce que je fais de mal mais je « fais quelque chose comme ceci:Image POST sur un problème de serveur Web

String mBoundary = "SUPSUPSUPSUP"; 

/* Preparar objeto a enviar */ 

InputStream mImagen = this.getClass().getResourceAsStream("sample.jpg");    
byte[] mBytesPostear = IOUtilities.streamToBytes(mImagen); 

HttpConnection mConexion = (HttpConnection) Connector.open("http://www.raspberry.com/script.php");      

/* Preparar headers del POST. Es multiformulario con POST de un archivo */ 
mConexion.setRequestMethod(HttpConnection.POST); 
mConexion.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_TYPE, HttpProtocolConstants.CONTENT_TYPE_MULTIPART_FORM_DATA + ";boundary=" + mBoundary); 
mConexion.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_LENGTH, String.valueOf(mBytesPostear.length)); 
mConexion.setRequestProperty("x-rim-transcode-content", "none");      

/* Preparar contenido de salida */ 
ByteArrayOutputStream mOutput = new ByteArrayOutputStream();    
OutputStream mOS = mConexion.openOutputStream(); 

/* Escribir contenido */ 
String nuevaLinea = "\r\n"; 
String contDisp="Content-Disposition:form-data; name=\"foto\";filename=\"sample.jpg\""; 
String contEnc = "Content-Transfer-Encoding: binary"; 
String type="Content-Type:image/jpeg"; 

mOutput.write(nuevaLinea.getBytes()); 
mOutput.write("--".getBytes()); 
mOutput.write(mBoundary.getBytes()); 
mOutput.write(nuevaLinea.getBytes()); 
mOutput.write(contDisp.getBytes()); 
mOutput.write(nuevaLinea.getBytes()); 
mOutput.write(type.getBytes()); 
mOutput.write(nuevaLinea.getBytes()); 
mOutput.write(contEnc.getBytes()); 
mOutput.write(nuevaLinea.getBytes()); 
mOutput.write(nuevaLinea.getBytes()); 
mOutput.write(mBytesPostear); 
mOutput.write(nuevaLinea.getBytes()); 
mOutput.write("--".getBytes()); 
mOutput.write(mBoundary.getBytes()); 
mOutput.write("--".getBytes());   
mOutput.write(nuevaLinea.getBytes()); 

/**********************/ 

/* Escribir el contenido */ 
mOS.write(mOutput.toByteArray()); 

mOutput.flush(); 
mOutput.close(); 

mOS.flush(); 
mOS.close(); 

/* Recibir respuesta del servidor */ 
InputStream mIS = mConexion.openInputStream(); 
int mLongitud = (int) mConexion.getLength(); 

if (mLongitud > 0) {     

    int mActual = 0; 
    int mBytesLeidos = 0; 
    byte[] mBytes = new byte[mLongitud]; 

    while ((mBytesLeidos != mLongitud) && (mActual != -1)){ 
     mActual = mIS.read(mBytes, mBytesLeidos, mLongitud - mBytesLeidos); 
     mBytesLeidos += mActual; 
    }    

    String mRespuesta = new String(mBytes);  
    System.out.println("Respuesta: " + mRespuesta); 

} 

Je viens d'essayer de cloner l'en-tête qui est envoyé par Chrome lorsque j'utilise la forme, je pense qu'ils ont les mêmes informations. Mon script PHP vérifie d'abord si quelque chose a été posté, si rien n'a été posté, puis il renvoie un message afin que je puisse "consommer" le script sur le serveur web et je peux voir que le périphérique Blackberry télécharge le données mais la réponse est que rien n'a été posté.

Je pense que j'envoie l'information au serveur dans un mauvais format.

Toute aide serait grandement appréciée.

Merci!

+0

Cela peut avoir Rien à voir avec PHP, si le code PHP fonctionne. Peu importe, il peut très bien avoir quelque chose à voir avec ce code Java. –

+0

Je suis presque sûr que le problème est avec le code Java, je demande effectivement de l'aide avec le code Java – Arturo

Répondre

1

J'ajouté au code toute la longueur et vérifié mon script PHP et il fonctionne très bien maintenant: c'est l'extrait complet juste au cas où quelqu'un d'autre a besoin il:

public class PostImagen { 
private String mURL; 
private byte[] mDatos; 

public PostImagen(String URLServicio, byte[] Datos){ 
    mDatos = Datos; 
    mURL = URLServicio; 
} 

public void getRespuesta() throws Exception {  
    try {          
     String mBoundary = "SUPSUP";    

     /* Strings a usar para el contenido */ 
     String nuevaLinea = "\r\n"; 
     String contDisp="Content-Disposition: multipart/form-data; name=\"foto\";filename=\"sample.jpg\""; 
     String contEnc = "Content-Transfer-Encoding: binary"; 
     String type="Content-Type:image/jpeg"; 

     /* Preparar objeto a enviar */ 
     byte[] mBytesPostear; 
     if (mDatos == null){ 
      InputStream mImagen = this.getClass().getResourceAsStream("sample.jpg");    
      mBytesPostear = IOUtilities.streamToBytes(mImagen); 
     } else { 
      mBytesPostear = mDatos; 
     }      

     System.err.println("Longitud de imagen: " + mBytesPostear.length); 



     /* Preparar contenido de salida */ 
     ByteArrayOutputStream mOutput = new ByteArrayOutputStream(); 
     mOutput.write(nuevaLinea.getBytes()); 
     mOutput.write("--".getBytes()); 
     mOutput.write(mBoundary.getBytes()); 
     mOutput.write(nuevaLinea.getBytes()); 
     mOutput.write(contDisp.getBytes()); 
     mOutput.write(nuevaLinea.getBytes()); 
     mOutput.write(type.getBytes()); 
     mOutput.write(nuevaLinea.getBytes()); 
     mOutput.write(contEnc.getBytes()); 
     mOutput.write(nuevaLinea.getBytes()); 
     mOutput.write(nuevaLinea.getBytes()); 
     mOutput.write(mBytesPostear); 
     mOutput.write(nuevaLinea.getBytes()); 
     mOutput.write("--".getBytes()); 
     mOutput.write(mBoundary.getBytes()); 
     mOutput.write("--".getBytes());   
     mOutput.write(nuevaLinea.getBytes()); 

     /* Preparar conexión y headers */ 
     HttpConnection mConexion = (HttpConnection) Connector.open(mURL); 
     mConexion.setRequestMethod(HttpConnection.POST); 
     mConexion.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_TYPE, HttpProtocolConstants.CONTENT_TYPE_MULTIPART_FORM_DATA + ";boundary=" + mBoundary); 
     mConexion.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_LENGTH, String.valueOf(mOutput.size()));   
     mConexion.setRequestProperty("x-rim-transcode-content", "none");  

     /**********************/ 
     System.err.println("Escribiendo stream"); 

     OutputStream mOS = mConexion.openOutputStream();    

     /* Escribir el contenido */ 
     mOS.write(mOutput.toByteArray()); 

     mOutput.flush(); 
     mOutput.close(); 

     mOS.flush(); 
     mOS.close(); 

     System.err.println("Se terminó de escribir payload, recibiendo respuesta"); 

     /* Recibir respuesta del servidor */ 
     if (mConexion.getResponseCode() != HttpConnection.HTTP_OK){    
      throw new Exception("El servidor NO regresó OK (200) al leer la respuesta. Saliendo..."); 
     } 

     InputStream mIS = mConexion.openInputStream(); 
     int mLongitud = (int) mConexion.getLength(); 

     if (mLongitud > 0) {     

      int mActual = 0; 
      int mBytesLeidos = 0; 
      byte[] mBytes = new byte[mLongitud]; 

      while ((mBytesLeidos != mLongitud) && (mActual != -1)){ 
       mActual = mIS.read(mBytes, mBytesLeidos, mLongitud - mBytesLeidos); 
       mBytesLeidos += mActual; 
      }    

      String mRespuesta = new String(mBytes);  
      System.out.println("Respuesta: " + mRespuesta); 

     } else {            
      throw new Exception("No se recibió respuesta del servidor"); 
     }           
    } catch (IOException e) {         
     throw new Exception("Error de lectura o escritura: " + e.getMessage()); 
    }  
} 

}

1

Je ne sais pas s'il y a d'autres problèmes, mais cela ne semble pas correcte:

mConexion.setRequestProperty(HttpProtocolConstants.HEADER_CONTENT_LENGTH, String.valueOf(mBytesPostear.length)); 

L'en-tête Content-Length est censé donner la longueur en octets du corps de la demande complète, y compris toutes les --boundary\r\nHeaders: stuff, pas seulement le champ de fichier téléchargé.

+0

J'ai essayé mais il semble que cela ne fonctionne toujours pas. J'ai vérifié les journaux d'accès du serveur Web et je retourne un 200 (OK) quand je fais la demande. J'essaie de vérifier les journaux d'erreurs, car il a été hébergé chez GoDaddy je ne sais pas comment le faire mais je leur demande. C'est la ligne que j'ai utilisée pour calculer la taille de la charge utile entière: int mTamañoTotal = mBytesPostear.length + nuevaLinea.length() * 8 + "-". Length() * 3 + mBoundary.length() * 2 + contDisp.length() + type.length() + contEnc.length(); – Arturo