Как загрузить видео файл через HTTP POST в JAVA без использования API YouTube - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу загрузить видеофайл на мой Youtube.

Я знаю официальный сайт (https://developers.google.com/youtube/v3/docs/videos), но я использую платформу Android, но нет служб воспроизведения Android.

А потом я узнаю о клиентской библиотеке Google API.

Я смотрю примеры API (https://github.com/youtube/api-samples/blob/master/java/src/main/java/com/google/api/services/samples/youtube/cmdline/data/UploadVideo.java).

Пример использования com.google.api.services.youtube. Но я не могу использовать API YouTube.

Я просто загружаювидео файл через http в java без YouTube API.

Это мой тестовый источник. Аннотация (// это не работает) отправляет vedio. Если источник Uncommented, я получил 400 ответов. Если источник Комментарий,Я получил 200 ответов.

public static String uploadMetaData(String filePath, boolean retry, String accessToken) throws IOException {

    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1 * 1024 * 1024;

    //String baseURL = "https://www.googleapis.com/youtube/v3/videos";
    String baseURL = "https://www.googleapis.com/upload/youtube/v3/videos";
    String urlData = "uploadType=resumable&part=snippet,status,contentDetails";
    String uploadUrl = baseURL + "?" + urlData;


    String postDataForm = "{\n\"snippet\": {\n\"title\": \"%s\",\n\"description\": \"%s\",\n\"tags\": " + "[\"cool\", \"video\", \"more keywords\"],\n\"categoryId\": 22\n},\n\"status\": " + "{\n\"privacyStatus\": \"public\",\n\"embeddable\": True,\n\"license\": \"youtube\"\n}\n}";
    String postData = String.format(postDataForm, "hong", "hong", "hong");
    JSONObject jsonObj = null;
    try {
        jsonObj = new JSONObject(postData);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    URL url = new URL(uploadUrl);
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    urlConnection.setRequestMethod("POST");
    urlConnection.setRequestProperty("Host", "www.googleapis.com");
    urlConnection.setRequestProperty("Authorization", String.format("Bearer %s", accessToken));
    urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
    urlConnection.setRequestProperty("X-Upload-Content-Type", "video/*");

    //urlConnection.setRequestProperty("Content-Length", String.valueOf(postData.length()));
    //urlConnection.setRequestProperty("X-Upload-Content-Length", );
    urlConnection.setDoOutput(true);

    String uploadFileName = "1541437905497.mp4";
    String fileName = Environment.getExternalStorageDirectory().getPath() + "/cmxMediaGallery/1541437905497.mp4";


    FileInputStream fileInputStream = new FileInputStream(fileName);

    DataOutputStream dos = new DataOutputStream(urlConnection.getOutputStream());

    dos.writeBytes(jsonObj.toString());

    // this is not working
    /*dos.writeBytes(twoHyphens + boundary + lineEnd);
    dos.writeBytes("Content-Disposition: form-data; name=" + uploadFileName + ";filename="
            + fileName  + lineEnd);

            dos.writeBytes(lineEnd);

    // create a buffer of  maximum size
    bytesAvailable = fileInputStream.available();

    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    buffer = new byte[bufferSize];

    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

    while (bytesRead > 0) {

        dos.write(buffer, 0, bufferSize);
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);

    }*/

    dos.flush();
    dos.close();

    int responseCode = urlConnection.getResponseCode();
    if (responseCode < 200 || responseCode >= 300) {
        if ((responseCode + "").startsWith("4") && retry) {
            return uploadMetaData(filePath, false, accessToken);
        } else {
            throw new IOException(String.format("response code='%s' (code %d)" + " for %s",
                    urlConnection.getResponseMessage(), responseCode, urlConnection.getURL()));
        }
    }

    Log.d("Hong", "responseCode : " + responseCode);

    return urlConnection.getHeaderField("Location");
}

В некоторых примерах используется multipart., Но он работает. connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

Я хочу знать, как загрузить видеофайл через HTTP POST в JAVA без использования YouTube API.

...