Youtube POST загрузить на Java - PullRequest
       22

Youtube POST загрузить на Java

5 голосов
/ 26 февраля 2010

Help :( Кто-нибудь знает, как написать POST-запрос для загрузки видео с YouTube через API YouTube в Java?

Структура требуемого запроса POST описана здесь .

К сожалению, я не могу использовать клиентские библиотеки Java на Youtube, потому что я работаю в Android, который их не поддерживает.

У меня есть несколько попыток кода ниже, но он не работает (я получаю ошибку, что conn.getResponseCode () имеет значение 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());
}

Ответы [ 2 ]

1 голос
/ 26 февраля 2010

conn.getResponseCode() возвращает примитив int, который не может быть нулевым. Я не уверен, о какой ошибке вы говорите (NullPointerException?), Но не получается, что getResponseCode возвращает null. Возможно, само по себе conn равно нулю?

Если это так, другое исключение, вероятно, было сгенерировано конструктором URL или url.openConnection (). В этом случае вы перехватываете исключение и печатаете трассировку стека на стандартный вывод, но продолжаете использовать ссылку на conn, которая может быть недопустимой.

1 голос
/ 26 февраля 2010

Ранее я использовал библиотеку загрузки файлов Apache, и она значительно упрощает почтовые запросы для файлов и т. Д. Загрузка файлов Apache Commons

...