2012-03-19 23 views
8

Modifica: Penso di aver capito come eseguire la parte di dati binari. Ricontrolla il codice, ma sono sicuro di aver capito bene. Ora sto ottenendo un nuovo errore quando si cerca di completare il caricamento come descritto nella Vimeo API documentationHTTP PUT per caricare un file in Java

Edit 2: Aggiunto .debug() per l'OAuthService e aggiornato l'uscita.

Domanda originale: Sto tentando di caricare un video su Vimeo utilizzando Vimeo API (Streaming Method). Sto utilizzando scribe per autorizzare la mia app, ottenere il mio token di accesso e prepararmi per il caricamento del video. Solo che non so cosa fare nel punto la documentazione API Vimeo dice "dati binari del file qui" in questo esempio di una richiesta HTTP per il 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

.... dati binari del file qui ....

Posso ottenere il biglietto e le intestazioni bene. È solo, cosa devo fare per inserire i dati binari del mio file?

Note:

  • Si tratta di un'applicazione desktop in Java
  • E 'un file video piccolo sto testando

Ecco il mio codice per la put (ricordate, sto usando 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; 
    } 

uscita del metodo signSendAndPrint(OAuthService service, Token accessToken, OAuthRequest request, String description) e sulla 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 

risposta

2

È necessario aggiungere altri due parametri quando completato il caricamento. Vimeo API documentation afferma che sono necessari tre parametri per vimeo.videos.upload.complete: filename, oauth_token e ticket_id. lo scriba si prende cura di oauth_token per te.

Inoltre, è necessario chiamare l'endpoint originale, non quello ottenuto quando si richiede un ticket.

+0

Fantastico! Funziona perfettamente! Grazie mille. Non posso credere che fosse così semplice, ma è così che è la metà del tempo. Grazie ancora :) – kentcdodds