2012-03-19 29 views
8

Chỉnh sửa: Tôi nghĩ rằng tôi đã tìm ra cách thực hiện phần dữ liệu nhị phân. Kiểm tra lại nó trong mã, nhưng tôi khá chắc chắn tôi đã có nó ngay. Bây giờ tôi gặp lỗi mới khi cố gắng hoàn tất quá trình tải lên như được mô tả trong Vimeo API documentationHTTP PUT để tải lên tệp trong Java

Chỉnh sửa 2: Đã thêm .debug() vào OAuthService và cập nhật đầu ra.

Câu hỏi gốc: Tôi đang cố gắng tải video lên Vimeo bằng cách sử dụng Vimeo API (Streaming Method). Tôi đang sử dụng scribe để cấp phép cho ứng dụng của mình, nhận mã thông báo truy cập và chuẩn bị tải lên video. Tôi chỉ không biết phải làm gì tại thời điểm tài liệu Vimeo API nói "dữ liệu nhị phân của tập tin của bạn ở đây" trong ví dụ này của một yêu cầu HTTP cho PUT:

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

host: 1.2.3.4:8080

Content-Length: 339108

Content-type: video/mp4

.... dữ liệu nhị phân của tập tin của bạn ở đây ....

Tôi có thể nhận được vé và tiêu đề tốt. Nó chỉ là, tôi phải làm gì để chèn dữ liệu nhị phân của tệp của tôi?

Ghi chú:

  • Đó là một ứng dụng máy tính để bàn trong Java
  • Đó là một tập tin video nhỏ Tôi đang thử nghiệm

Dưới đây là mã của tôi cho đặt (hãy nhớ, tôi đang sử dụng 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; 
    } 

Đầu ra của phương pháp signSendAndPrint(OAuthService service, Token accessToken, OAuthRequest request, String description) và trên 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.<init>(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 

Trả lời

2

Bạn cần thêm hai thông số khác khi hoàn tất tải lên. Vimeo API documentation cho biết bạn cần ba thông số cho vimeo.videos.upload.complete: tên tệp, oauth_token và ticket_id. người ghi chép sẽ chăm sóc oauth_token cho bạn.

Hơn nữa, bạn phải gọi điểm cuối ban đầu, không phải là điểm cuối nhận được khi yêu cầu vé.

+0

Tuyệt vời! Hoạt động hoàn hảo! Cảm ơn nhiều. Tôi không thể tin nó quá đơn giản, nhưng đó là cách nó chỉ bằng một nửa thời gian. Cảm ơn một lần nữa :) – kentcdodds

Các vấn đề liên quan