5

帮助 :( 有谁知道如何用 Java 编写通过 Youtube API 上传 Youtube 视频的 POST 请求?

此处描述了所需的 POST 请求的结构。

不幸的是,我无法使用 Youtube Java 客户端库,因为我正在使用不支持它们的 Android 系统。

我在下面尝试了一些代码,但它不起作用(我收到 conn.getResponseCode() 为空的错误)。


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

2 回答 2

1

我之前使用过 Apache 文件上传库,它极大地简化了对文件等的发布请求: Apache commons file upload

于 2010-02-26T17:04:38.917 回答
1

conn.getResponseCode()返回一个原始 int,它不能为 null。我不确定您在谈论哪种错误(NullPointerException?),但 getResponseCode 不可能返回 null。也许 conn 本身是空的?

如果是这样,则 URL 构造函数或 url.openConnection() 可能引发了另一个异常。在这种情况下,您正在捕获异常并将堆栈跟踪打印到标准输出,但继续使用可能无效的 conn 引用。

于 2010-02-26T17:21:33.337 回答