2010-02-26 3 views
5

Hilfe :(Wer weiß, wie eine POST-Anforderung für das Hochladen von YouTube-Videos über die YouTube-API in Java?Youtube POST in Java laden

Die Struktur der POST-Anforderung schreiben erforderlich here beschrieben.

Leider kann ich die Youtube-Java-Client-Bibliotheken nicht verwenden, da ich unter Android arbeite, das sie nicht unterstützt

Ich habe versucht, Code unten, aber es funktioniert nicht (ich bekomme den Fehler conn.getResponseCode() ist null)

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()); 
} 

Antwort

1

Ich habe die Apache-Datei-Upload-Bibliothek, bevor sie verwendet und es vereinfacht Post Anfragen für Dateien usw. stark: Apache commons file upload

1

conn.getResponseCode() gibt eine primitive int, die nicht null sein kann. Ich bin mir nicht sicher, über welche Art von Fehler Sie sprechen (NullPointerException?), Aber es ist nicht möglich, dass getResponseCode null zurückgibt. Vielleicht ist Conn selbst null?

Wenn ja, wurde wahrscheinlich eine andere Ausnahme vom URL-Konstruktor oder von url.openConnection() ausgelöst. In diesem Fall fangen Sie die Ausnahme ab und drucken den Stack-Trace auf stdout, verwenden aber weiterhin die conn-Referenz, die möglicherweise ungültig ist.