2011-01-19 38 views
6

我试图下载一个大(600MB)的二进制文件上的Coldfusion 8使用CFHTTP的服务器的ColdFusion下载大文件:使用CFHTTP

<cfhttp 
    method="get" 
    url="#fileURL#" 
    path="#filePath#" 
    file="#fileName#" 
    timeout="600" 
    getasbinary="auto" 
> 

它的正常工作对于较小的文件(100something MB),但对于大型的我得到的Server 500错误:“java.lang.OutOfMemoryError:Java堆空间”。

该文件正在从Dropbox文件夹下载 - 因此只有可用的选项是使用HTTP GET。

有没有人有想法如何下载它,所以它不会杀死服务器或超时?

+1

如果它在Dropbox的文件,为什么不直接在服务器上安装Dropbox的客户端,并观看了新的/更新文件的目录? – 2011-01-19 22:14:28

+0

因为我们在同一台服务器上有不同的客户端 - 不能安装多个Dropbox客户端。但感谢Ben的想法。 – Lucas 2011-01-20 09:06:47

回答

14

您可以通过从CF代码调用Java来做到这一点。缓冲的输入和输出流类被设计为保存大量数据,而不是整个事物,避免OutOfMemory错误。

getByteArray()是一个辅助方法,因为没有办法在CF中直接声明类似byte buf[]=new byte[1024];的东西。

在该示例中更改sourcedestination变量。

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

问题在于它太大了。在将其写入磁盘之前,ColdFusion将整个事物读入内存。

你最好使用其他方法来获取文件。 wget可以从命令行执行http请求。明智地使用CFEXECUTE可能是一个好方法。

+0

感谢您的想法铝。 – Lucas 2011-01-20 08:58:53