2013-01-02 22 views
25

* NEU AKTIVIERT FÜR BESSEREN ZWEITEN TEIL - JETZT KOMMT ZU "308 Resume Incomplete", obwohl die Datei nur einmal hochgeladen werden sollte!Dateien auf Google Drive mit ColdFusion hochladen

Ich benutze die Grundlage von cfgoogle von Ray Camden. Aber Google hat den Code für das Hochladen von Dokumenten abgelehnt. Der neue Standard lautet Resumable Media Uploads.

Ich habe dieses Teil funktioniert (bis einschließlich die "Initiieren eine wiederaufsetzbare Upload-Anfrage") in dem oben genannten Google-Dokument.

Berufung Seite:

<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)> 

Der Code funktioniert bis zu und einschließlich der cfset Temperaturleitung (immer die einzigartige Upload URI)

Hier ist der Code für 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 - so weit so gut. Aber hier ist, wo es zusammenbricht:

Running upload_file gibt "308 Resume Incomplete" (A es ist kein 400!) Von Google. Arrgh !! Hier

ist die 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> 

Also, da haben wir es - wo ich stecken bin. Ich kann die einzigartige URI bekommen, aber (vielleicht weil es spät in der Nacht ist) Ich bin hirntot auf, was ich falsch mache, sonst um den Datei-Upload abzuschließen.

Alle Hilfe ist willkommen.

+1

Ich bemerke, dass Sie in der Inhaltsbereichskopfzeile die Dateigröße als gelesene Festplatte verwenden, aber im Textbereich senden Sie trim (FileText), was bedeutet, dass die Datei, wenn die Datei führende oder nachstehende Leerzeichen enthält Die Körpergröße der Anfrage ist kleiner als die Größe, die Sie senden möchten. Sie könnten versuchen, len (trim (FileText)) zu verwenden, um den Bereich und die Größe Ihres Sendens in den Kopfzeilen für Inhaltsbereich und Inhaltslänge zu berechnen. – barnyr

+1

Sie könnten auch versuchen, eine FileReadBinary zu tun und diese in den Anfragetext zu senden, es sei denn, es gibt einen Grund, den Dateiinhalt zu trimmen – barnyr

+1

Haben Sie das gelöst? Folgendes [hier] gefunden (http://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal). _Bei Erhalt des Inhaltskörpers einer Wiederaufnahmeanforderung kann der Server immer noch nicht den vollständigen Bytebereich besitzen, was eine weitere Aktion (z. B. zusätzliche Anforderungen) vom Client erfordert. In solchen Fällen SOLLTE der Server den Statuscode 308 (Resume Incomplete) zurückgeben, wenn er weiterhin mit der Operation fortfahren möchte. _ _Bei der Definition gibt die Antwort 308 (Resume Incomplete) an, dass der Client die aktuelle Fehlerbedingung durch Senden der Bytes korrigieren kann was der Server fehlt_ –

Antwort

1

Ich empfehle dringend einen anderen Ansatz hier. Es gibt zwei große Probleme mit dem Pfad, den Sie nehmen:

  • Es scheint, dass der Code den veralteten Client-Login-Authentifizierungsmechanismus verwendet und den Benutzernamen/das Kennwort anstelle von OAuth verwendet.
  • Verwenden der API für veraltete Dokumentlisten anstelle der neueren Drive API.
  • Da Sie Java aufrufen können, würde ich empfehlen, den Upload-Code in Java zu schreiben und ihn dann von Ihren CF-Seiten nach Bedarf aufzurufen.

    Verwandte Themen