2010-02-26 12 views
5

Ayuda :(¿Alguien sabe cómo escribir una solicitud POST para cargar los vídeos de Youtube a través de la API de Youtube, en Java?Youtube POST de carga en Java

La estructura de la solicitud POST requerida se describe here.

Desafortunadamente no puedo usar las bibliotecas de cliente de Youtube Java, porque estoy trabajando en Android, que no las admite.

Tengo un código intentado a continuación, pero no funciona (obtengo el error que conn.getResponseCode() es nulo).


public void videoUpload() { 

    HttpURLConnection conn = null; 
    // BufferedReader br = null; 
    DataOutputStream dos = null; 
    InputStream inStream = null; 

    // InputStream is = null; 
    // OutputStream os = null; 
    // boolean ret = false; 
    // String StrMessage = ""; 
    //file path 

    // get filename from videoURI 
    String path = "file:///sdcard/"; 
    String existingFileName = "video.3gp"; 
    File videoFile = new File(path + existingFileName); 

    // String lineEnd = "\r\n"; 
    String twoHyphens = "--"; 
    String boundary = "b93dcbA3"; 
    String ver = "2"; 

    int bytesRead, bytesAvailable, bufferSize; 
    byte[] buffer; 
    int maxBufferSize = 1024; 

    // String responseFromServer = ""; 

    try { 
     FileInputStream fileInputStream = new FileInputStream(videoFile); 

     URL url = new URL("http://uploads.gdata.youtube.com/feeds/api/users/[XXXXXXXXXX]/uploads"); 
     conn = (HttpURLConnection) url.openConnection(); 

     // Allow Inputs 
     conn.setDoInput(true); 
     // Allow Outputs 
     conn.setDoOutput(true); 
     // Don't use a cached copy. 
     conn.setUseCaches(false); 

     // Use a post method. 
     conn.setRequestMethod("POST"); 
     // conn.setRequestProperty("Connection", "Keep-Alive"); 
     conn.setRequestProperty("Host", "uploads.gdata.youtube.com"); 
     conn.setRequestProperty("Authorization", "GoogleLogin auth=" + token); 
     conn.setRequestProperty("GData-Version", ver); 
     conn.setRequestProperty("X-Gdata-Client", clientId); 
     conn.setRequestProperty("X-GData-Key", "key=" + developerKey); 
     conn.setRequestProperty("Slug", existingFileName); //fix this 
     conn.setRequestProperty("Content-Type", 
       "multipart/related;boundary=" + boundary); 
     conn.setRequestProperty("Content-Length", new Long(videoFile //and this 
       .length()).toString()); 
     conn.setRequestProperty("Connection", "close"); 

     //do we not want a boundary string here? 

     conn.setRequestProperty("Content-Type", 
     "application/atom+xml; charset=UTF-8"); 

     //and here? 
     conn.setRequestProperty("Content-Type", "video/3gpp"); 
     conn.setRequestProperty("Content-Transfer-Encoding", "binary"); 

     dos = new DataOutputStream(conn.getOutputStream()); 
     dos.write((twoHyphens + boundary).toString().getBytes()); 

     StringBuilder test_xml = new StringBuilder(); 
     test_xml.append("<?xml version='1.0' encoding='UTF-8'?>\n"); 
     test_xml.append("<entry xmlns=\"http://www.w3.org/2005/Atom\"\n"); 
     test_xml.append("xmlns:media=\"http://search.yahoo.com/mrss/\"\n"); 
     test_xml.append("xmlns:yt=\"http://gdata.youtube.com/schemas/2007\">\n"); 
     test_xml.append("<media:group>\n"); 
     test_xml.append("<media:title type=\"plain\">Test Video</media:title>\n"); 
     test_xml.append("<media:description type=\"plain\">\nTest Video\n</media:description>\n"); 
     test_xml.append("<media:category\n"); 
     test_xml.append("scheme=\"http://gdata.youtube.com/schemas/2007/categories.cat\">People\n"); 
     test_xml.append("</media:category>\n"); 
     test_xml.append("<media:keywords>toast, election, wedding</media:keywords>\n"); 
     test_xml.append("</media:group>\n"); 
     test_xml.append("</entry>"); 

     dos.write(test_xml.toString().getBytes("UTF-8")); 

     // System.out.println(test_xml.toString()); 
     dos.write((twoHyphens + boundary).toString().getBytes()); 

     // create a buffer of maximum size 
     bytesAvailable = fileInputStream.available(); 
     bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     buffer = new byte[bufferSize]; 

     // read file and write it into form 
     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     while (bytesRead > 0) { 
      // dos.flush(); 
      dos.write(buffer, 0, bufferSize); 
      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     } 

     // byte [] buf = new byte[2048]; // Transfer in 2k chunks 
     // int bytesRead = 0; 
     // while ((bytesRead = fileInputStream.read(buf, 0, buf.length)) >= 
     // 0) { 
     // dos.write(buf, 0, bytesRead); 
     // // dos.flush(); 
     // } 

     // send multipart form data necesssary after file data 
     // dos.writeBytes(lineEnd); 
     // dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
     dos.write((twoHyphens + boundary + twoHyphens).toString() 
       .getBytes()); 

     // close streams 
     fileInputStream.close(); 
     dos.flush(); 
     dos.close(); 


    } catch (MalformedURLException ex) { 
     ex.printStackTrace(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 


    int responseCode; 
    StringBuilder outputBuilder = new StringBuilder(); 
    try { 
     responseCode = conn.getResponseCode(); 
     if (responseCode == HttpURLConnection.HTTP_OK) { 
      inStream = conn.getInputStream(); 
     } else { 
      inStream = conn.getErrorStream(); 
     } 

     String string; 
     if (inStream != null) { 
      BufferedReader reader = new BufferedReader(
        new InputStreamReader(inStream)); 
      while (null != (string = reader.readLine())) { 
       outputBuilder.append(string).append("\n"); 
      } 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally { 
     if (inStream != null) { 
      try { 
       inStream.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    System.out.println(outputBuilder.toString()); 
    Log.d(LOG_TAG, outputBuilder.toString()); 
} 

Respuesta

1

he utilizado la biblioteca de carga de archivos de Apache antes y simplifica las solicitudes para colocar los archivos etc. mucho: Apache commons file upload

1

conn.getResponseCode() devuelve un int primitivo, que no puede ser nulo. No estoy seguro de qué tipo de error está hablando (NullPointerException?), Pero no es posible que getResponseCode devuelva null. Tal vez conn sí mismo es nulo?

Si es así, probablemente otra excepción fue lanzada por el constructor URL o por url.openConnection(). En este caso, está capturando la excepción e imprimiendo la traza de pila a stdout, pero continúa usando la referencia de conexión, que puede ser inválida.