2013-01-02 9 views
25

* NUOVO AGGIORNATO PER MIGLIORE PARTE SECONDO - ORA OTTIENE "308 Riprendi incompleto", anche se il file dovrebbe essere solo un caricamento!Carica file su Google Drive utilizzando ColdFusion

Sto utilizzando la base di cfgoogle da Ray Camden. Ma Google ha deprecato il codice per i caricamenti di documenti. Il nuovo standard è Resumable Media Uploads.

Ho questa parte funzionante (fino a includere "Iniziare una richiesta di caricamento ripristinabile") nel documento Google di riferimento sopra riportato.

Calling Pagina:

<cfset application.cfc.Google     = createObject('component','#path_cf_cfc#Google') /> 
<cfset application.cfc.GoogleDocs    = createObject('component','#path_cf_cfc#GoogleDocs') /> 

<cfset gtoken = application.cfc.GoogleDocs.authenticate(emailaddress,password)> 

<CFSET testdoc = "a\filepath\documentname.doc"> 
<CFSET FileType = "application/msword"> 
<CFSET FileTitle = "test_001"> 

<cfset temp = application.cfc.GoogleDocs.upload_auth("#Application.Map.DocStorage##tv.testdoc#",FileType,FileTitle)> 

<CFSET uploadpath = Listgetat(Listgetat(temp.header,ListContains(temp.header,"https://docs.google.com","#chr(10)#"),"#chr(10)#"),2," ") > 

<cfset temp2 = application.cfc.GoogleDocs.upload_file("#Application.Map.DocStorage##tv.testdoc#",FileType,FileTitle,uploadpath)> 

Il codice funziona fino ae includendo la linea di temperatura cfset (ottenendo il caricamento unico URI)

Ecco il codice per upload_auth:

<cffunction name="upload_auth" access="public" returnType="any" hint="I get a uniqu URI from Google API." output="false"> 
<cfargument name="myFile" type="string" required="true" hint="filepath to upload."> 
<cfargument name="myType" type="string" required="true" hint="application/msword"> 
<cfargument name="myTitle" type="string" required="true" hint="name of doc"> 

<cfset GoogleUrl = "https://docs.google.com/feeds/upload/create-session/default/private/full"> 
<cfset GoogleVersion = 3> 
<cfset FileSize = createObject("java","java.io.File").init(myFile).length()> 

<cfhttp url="#GoogleUrl#" method="post" result="diditwork" resolveurl="no"> 
<cfhttpparam type="header" name="Authorization" value="GoogleLogin auth=#getAuth(variables.docservice)#"> 
<cfhttpparam type="header" name="GData-Version" value="#GoogleVersion#"> 
<cfhttpparam type="header" name="Content-Length" value="0"> 
<cfhttpparam type="header" name="X-Upload-Content-Type" value="#myType#"> 
<cfhttpparam type="header" name="X-Upload-Content-Length" value="#FileSize#"> 
<cfhttpparam type="header" name="Slug" value="#myTitle#"> 

</cfhttp> 

<cfreturn diditwork> 
</cffunction> 

OK - Così così buono. Ma qui è dove si rompe:

L'esecuzione upload_file restituisce "308 Riprendi incompleto" (A tal fine non è un 400!) Da Google. Arrgh !!

Ecco l'upload_file -

<cffunction name="upload_file" access="public" returnType="any" hint="I upload the document." output="false"> 
<cfargument name="myFile" type="string" required="true" hint="filepath to upload."> 
<cfargument name="myType" type="string" required="true" hint="like application/msword"> 
<cfargument name="myTitle" type="string" required="true" hint="name of doc"> 
<cfargument name="myAuthPath" type="string" required="true" hint="call auth"> 

<cfset FileSize = GetFileInfo(myFile).size > 
<CFSET tv.tostartwithzero = FileSize - 1> 

<CFFILE action="read" file="#myfile#" variable="FileText"> 

<cfhttp url="#myAuthPath#" method="put" result="diditwork" resolveurl="no" multipart="yes" charset="utf-8" > 
<cfhttpparam type="header" name="Authorization" value="GoogleLogin auth=#getAuth(variables.docservice)#"> 
<cfhttpparam type="header" name="GData-Version" value="#variables.GoogleVersion#"> 
<cfhttpparam type="header" name="Content-Length" value="#FileSize#"> 
<cfhttpparam type="header" name="Content-Range" value="bytes 0-#tv.tostartwithzero#/#FileSize#"> 
<cfhttpparam type="header" name="Content-Type" value="#myType#"> 

<cfhttpparam type="body" value="#trim(FileText)#"> 

</cfhttp> 

<cfreturn diditwork> 
</cffunction> 

Quindi, non l'abbiamo - dove mi sono bloccato. Posso ottenere l'URI univoco, ma (forse perché è tardi la notte) sono cerebralmente morto su ciò che sto facendo male altrimenti per completare il caricamento del file.

Tutto l'aiuto è apprezzato.

+1

Mi accorgo che nell'intestazione del campo di contenuto si sta utilizzando la dimensione del file come disco letto, ma nel corpo si invia trim (FileText), il che significa che se il file contiene spazi iniziali o finali, il richiesta la dimensione del corpo sarà più piccola della dimensione che stai richiedendo di inviare. Potresti provare a usare len (trim (FileText)) per calcolare l'intervallo e dimensionare il tuo invio nelle intestazioni del campo di contenuti e della lunghezza del contenuto? – barnyr

+1

Si potrebbe anche provare a fare un FileReadBinary e inviarlo nel corpo della richiesta, a meno che non ci sia un motivo per ritagliare il contenuto del file – barnyr

+1

Hai risolto questo problema? Trovato il seguente [here] (http://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal). _Quando riceve il corpo del contenuto di una richiesta di ripresa, il server potrebbe non disporre ancora dell'intero intervallo di byte, richiedendo ulteriori azioni (ad esempio richieste aggiuntive) dal client. In questi casi, il server DOVREBBE restituire il codice di stato 308 (Resume Incomplete) se è ancora disposto a continuare l'operazione._ _Per la definizione, la risposta 308 (Resume Incomplete) indica che il client può correggere la condizione di errore corrente inviando i byte quale manca il server_ –

risposta

1

Consiglio vivamente di adottare un approccio diverso qui. Ci sono due grandi problemi con il percorso che stai prendendo:

  • appare il codice utilizza il meccanismo di autenticazione del client di login deprecato e sta usando il nome utente/password invece di OAuth.
  • Utilizzo dell'API dell'elenco di documenti deprecato anziché dell'API di Drive più recente.

Poiché è possibile chiamare java, suggerirei di scrivere il codice di caricamento in Java semplice richiamandolo dalle pagine CF in base alle necessità.