Możesz to zrobić, wywołując Java z kodu CF. Zbuforowane klasy strumienia wejściowego i wyjściowego są zaprojektowane tak, aby przechowywały porcje danych, a nie całą całość, unikając błędów OutOfMemory.
getByteArray()
to metoda pomocnicza, ponieważ nie ma sposobu, aby zadeklarować coś w rodzaju bezpośrednio w wersji byte buf[]=new byte[1024];
.
W tym przykładzie zmień zmienne source
i destination
.
Przykład
<cfset source = 'protocol://domain/path/to/file.ext'>
<cfset destination = getDirectoryFromPath(getCurrentTemplatePath()) & listlast(source, "/")>
<cffunction name="getByteArray" access="private" returnType="binary" output="no">
<cfargument name="size" type="numeric" required="true"/>
<cfset var emptyByteArray =
createObject("java", "java.io.ByteArrayOutputStream").init().toByteArray()/>
<cfset var byteClass = emptyByteArray.getClass().getComponentType()/>
<cfset var byteArray =
createObject("java","java.lang.reflect.Array").newInstance(byteClass, arguments.size)/>
<cfreturn byteArray/>
</cffunction>
<cfscript>
uri = createObject("java", "java.net.URL").init(source);
uis = uri.openStream();
bis = createObject("java", "java.io.BufferedInputStream").init(uis);
fos = createObject("java", "java.io.FileOutputStream").init(destination);
bos = createObject("java", "java.io.BufferedOutputStream").init(fos);
buffer = getByteArray(1024);
len = bis.read(buffer);
while(len > 0) {
bos.write(buffer,0,len);
len = bis.read(buffer);
}
bos.close();
bis.close();
fos.close();
uis.close();
</cfscript>
Jeśli jest to plik w Dropbox, dlaczego nie wystarczy zainstalować klienta Dropbox na serwerze, i obejrzeć katalog dla nowych/zaktualizowanych plików? –
Ponieważ mamy kilka oddzielnych klientów na tym samym serwerze - nie można zainstalować wielu klientów Dropbox. Ale dzięki za pomysł Ben. – Lucas