HTTP PUT以Java格式上传文件

编辑:我想我已经弄清楚如何做二进制数据部分。 在代码中仔细检查它,但我很确定我做对了。 现在,我在尝试按照Vimeo API文档中的描述完成上传时遇到了新错误

编辑2:将 .debug()添加到OAuthService并更新输出。

原始问题 :我正在尝试使用Vimeo API(流媒体方法)将video上传到Vimeo。 我正在使用scribe来授权我的应用,获取我的访问令牌并准备上传video。 在这个PUT的HTTP请求示例中,我只是不知道该怎么做Vimeo API文档说“你的文件的二进制数据”。

PUT http://1.2.3.4:8080/upload?ticket_id=abcdef124567890 HTTP / 1.1

主持人:1.2.3.4:8080

内容长度:339108

内容类型:video / mp4

….你的文件的二进制数据在这….

我可以得到罚单和标题。 它只是,我该怎么做才能插入我的文件的二进制数据?

笔记:

  • 它是Java中的桌面应用程序
  • 这是我正在测试的一个小video文件

这是我的put代码(记住,我正在使用scribe )

// Setup File (line 52) File testUp = new File("C:/Users/Kent/Desktop/test.mp4"); String contentLength = Long.toString(testUp.length()); System.out.println("The content length is: " + contentLength); byte[] fileBytes = ByteStreams.toByteArray(new FileInputStream(testUp)); // Upload file (line 58) request = new OAuthRequest(Verb.PUT, endpoint); request.addHeader("Content-Length", contentLength); request.addHeader("Content-Type", "video/mp4"); request.addPayload(fileBytes); response = signSendAndPrint(service, accessToken, request, "Upload PUT: " + endpoint); // Check response code is valid (line 65) if (response.getCode() != 200) { System.out.println("The response was not 200! It was: " + response.getCode()); return; } // Verify the upload (line 71) request = new OAuthRequest(Verb.PUT, endpoint); request.addHeader("Content-Length", "0"); request.addHeader("Content-Range", "bytes */*"); response = signSendAndPrint(service, accessToken, request, "Verify Upload PUT: " + endpoint); // Check response code is valid (line 77) if (response.getCode() != 308) { System.out.println("The response was not 308! It was: " + response.getCode()); return; } // Complete Upload (line 83) request = new OAuthRequest(Verb.PUT, endpoint); request.addQuerystringParameter("method", "vimeo.videos.upload.complete"); Response completeResponse = signSendAndPrint(service, accessToken, request, "complete"); // This is line 86, it's the second to top level of my code that breaks the process. //Set video info (line 88) setVimeoVideoInfo(completeResponse, service, accessToken, vimeoAPIURL); } /** * Signs the request on the service, prints information on the request, sends the request, prints * information on the response and returns the response * * @param service * @param accessToken * @param request * @param description * @return */ private static Response signSendAndPrint(OAuthService service, Token accessToken, OAuthRequest request, String description) { service.signRequest(accessToken, request); printRequest(request, description + " Request"); Response response = request.send(); //This is line 105. It's the top level of my code that breaks the process printResponse(response, description + " Response"); return response; } 

输出signSendAndPrint(OAuthService service, Token accessToken, OAuthRequest request, String description)方法以及OAuthService.debug()

 Upload PUT: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e Request Headers: {Authorization=OAuth oauth_signature="MTPIVFfGVUQn4QswNV6av4CjzJw%3D", oauth_version="1.0", oauth_nonce="-606493399", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="MY_CONSUMER_KEY", oauth_token="MY_OAUTH_TOKEN", oauth_timestamp="1332428103", Content-Length=15125120, Content-Type=video/mp4} Verb: PUT Complete URL: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e Upload PUT: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e Response Code: 200 Headers: {null=HTTP/1.1 200 OK, Content-Length=0, Connection=close, Content-Type=text/plain, Server=Vimeo/1.0} Body: signing request: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e setting token to: Token[87bddf1382ac9f423d4b7c4166bdf0b2 , fdae7a033c7e1c932abce533627d6045124e8593] generating signature... base string is: PUT&http%3A%2F%2F174.129.155.54%3A8080%2Fupload&oauth_consumer_key%3DMY_CONSUMER_KEY%26oauth_nonce%3D1585934110%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1332428110%26oauth_token%3DMY_OAUTH_TOKEN%26oauth_version%3D1.0%26ticket_id%3Da64ed67b4aefdc35d18aec6cfa0b7c5e signature is: bhWu7IX9JKEEn/ULcpJECEuwqOc= appended additional OAuth parameters: { oauth_signature -> bhWu7IX9JKEEn/ULcpJECEuwqOc= , oauth_version -> 1.0 , oauth_nonce -> 1585934110 , oauth_signature_method -> HMAC-SHA1 , oauth_consumer_key -> MY_CONSUMER_KEY, oauth_token -> MY_OAUTH_TOKEN, oauth_timestamp -> 1332428110 } using Http Header signature Verify Upload PUT: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e Request Headers: {Authorization=OAuth oauth_signature="bhWu7IX9JKEEn%2FULcpJECEuwqOc%3D", oauth_version="1.0", oauth_nonce="1585934110", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="MY_CONSUMER_KEY", oauth_token="MY_OAUTH_TOKEN", oauth_timestamp="1332428110", Content-Length=0, Content-Range=bytes */*} *///Note, this is not part of the output, I just added */// so the rest of it doesn't appear commented out. Verb: PUT Complete URL: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e Verify Upload PUT: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e Response Code: 308 Headers: {null=HTTP/1.1 308 Resume Incomplete, Range=bytes=0-15125119, Content-Length=0, Connection=close, Content-Type=text/plain, Server=Vimeo/1.0} Body: signing request: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e&method=vimeo.videos.upload.complete setting token to: Token[87bddf1382ac9f423d4b7c4166bdf0b2 , fdae7a033c7e1c932abce533627d6045124e8593] generating signature... base string is: PUT&http%3A%2F%2F174.129.155.54%3A8080%2Fupload&method%3Dvimeo.videos.upload.complete%26oauth_consumer_key%3DMY_CONSUMER_KEY%26oauth_nonce%3D3111236130%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1332428110%26oauth_token%3DMY_OAUTH_TOKEN%26oauth_version%3D1.0%26ticket_id%3Da64ed67b4aefdc35d18aec6cfa0b7c5e signature is: vXlQ6OUKms8eHan+wEBO2HXBn/M= appended additional OAuth parameters: { oauth_signature -> vXlQ6OUKms8eHan+wEBO2HXBn/M= , oauth_version -> 1.0 , oauth_nonce -> 3111236130 , oauth_signature_method -> HMAC-SHA1 , oauth_consumer_key -> MY_CONSUMER_KEY, oauth_token -> MY_OAUTH_TOKEN, oauth_timestamp -> 1332428110 } using Http Header signature complete Request Headers: {Authorization=OAuth oauth_signature="vXlQ6OUKms8eHan%2BwEBO2HXBn%2FM%3D", oauth_version="1.0", oauth_nonce="3111236130", oauth_signature_method="HMAC-SHA1", oauth_consumer_key="MY_CONSUMER_KEY", oauth_token="MY_OAUTH_TOKEN", oauth_timestamp="1332428110"} Verb: PUT Complete URL: http://174.129.155.54:8080/upload?ticket_id=a64ed67b4aefdc35d18aec6cfa0b7c5e&method=vimeo.videos.upload.complete Exception in thread "main" org.scribe.exceptions.OAuthException: Problems while creating connection. at org.scribe.model.Request.send(Request.java:70) at org.scribe.model.OAuthRequest.send(OAuthRequest.java:12) at autouploadermodel.VimeoTest.signSendAndPrint(VimeoTest.java:105) at autouploadermodel.VimeoTest.main(VimeoTest.java:86) Caused by: java.net.SocketException: Unexpected end of file from server at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:723) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:589) at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:720) at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:589) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1319) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468) at org.scribe.model.Response.(Response.java:28) at org.scribe.model.Request.doSend(Request.java:110) at org.scribe.model.Request.send(Request.java:62) ... 3 more Java Result: 1 

完成上传后,您需要附加其他两个参数。 Vimeo API文档说vimeo.videos.upload.complete需要三个参数:filename,oauth_token和ticket_id。 抄写员为你照顾oauth_token。

此外,您必须调用原始端点,而不是请求票证时获得的端点。