* 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.
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
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
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_ –