coldfusion - 使用CFHTTP在ColdFusion中下载大文件

标签 coldfusion download coldfusion-8 cfhttp

我正在尝试在Coldfusion 8上使用CFHTTP将较大的(600MB)二进制文件下载到服务器:

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

对于较小的文件(大约100兆MB),它工作正常,但对于较大的文件,我却收到服务器500错误:“java.lang.OutOfMemoryError:Java堆空间”。

该文件是从Dropbox文件夹下载的-因此唯一可用的选项是使用HTTP GET。

有谁知道如何下载它,这样就不会杀死服务器或超时?

最佳答案

您可以通过从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>

关于coldfusion - 使用CFHTTP在ColdFusion中下载大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4738610/

相关文章:

coldfusion - 如何在Coldfusion中获取当前页面的URL?在获取当前页面网址时,我正在获取home_page_URL/index.cfm

tomcat - ColdFusion 10 实例/Tomcat 以可预测的时间间隔死亡(死亡白屏)

javascript - 使用 Javascript 将下载功能添加到点击事件

r - 如何在R中下载谷歌工作表中的所有工作表

coldfusion - 使用 ColdFusion 从字符串末尾删除设定数量的字符

coldfusion - 将查询结果存储在 Application.cfc 中的好或坏做法

math - ColdFusion 圆函数

email - 如何 "Reply to this email to comment"喜欢 Facebook?

ios - Swift Data(contentsOf) 参数传递给不带参数的调用

coldfusion - 在CF8中使用cfpop访问gmail