Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File upload 如何防止Coldfusion中的多文件上载超时?_File Upload_Coldfusion_Timeout - Fatal编程技术网

File upload 如何防止Coldfusion中的多文件上载超时?

File upload 如何防止Coldfusion中的多文件上载超时?,file-upload,coldfusion,timeout,File Upload,Coldfusion,Timeout,我有一个自动例程,用户可以触发它将图像上传到AmazonS3。用户通常会有超过500个项目需要上传,我正在努力寻找一种方法来避免过程超时 现在我正在这样做: <form action="hs_import.cfm?ansicht=Bilder&RequestTimeout=5000" method="post" name="uploader"> ... <input type="button" OnClick="bilder_upload()" value="#

我有一个自动例程,用户可以触发它将图像上传到AmazonS3。用户通常会有超过500个项目需要上传,我正在努力寻找一种方法来避免过程超时

现在我正在这样做:

<form action="hs_import.cfm?ansicht=Bilder&RequestTimeout=5000" method="post" name="uploader">
...
    <input type="button" OnClick="bilder_upload()" value="#tx_gen_run#">
    <input type="hidden" name="artikel_uploaden" value="ja">
    <input type="hidden" name="ansicht" value="imageloader">
</form>

...
触发javascript函数,触发我的上传(SAN详细信息):


S3变量
选择不同的imgpath
if(ImageGetWidth(基础)LT ImageGetHeight(基础)){
//肖像画
}否则{
//景观/广场
}
//清理
这工作正常,但如果图像数量太多,浏览器就会挂起/超时,因此我通常会看到一个从未完成的加载屏幕,并且不会提示成功/错误

问题
除了像这样处理大型文件上传,还有什么更好的选择?例如,是否应该将其放入
cfschedule
,以便它可以在后台运行


谢谢你的提示

您正在一个cfquery上循环,这是一个非常糟糕的做法,可能会导致严重的速度减慢。解决这个问题的一种方法是将100个查询存储到一个变量中,然后一次运行多个查询(打开和关闭连接可能需要很长时间)。当我使用这种方式进行大规模更新时,将获得更快90%的性能改进


这可能足以让您的流程正常工作。当然,如果您有很多非常大的图像,那么没有什么可以做的(除了限制图像大小)

您试图在一个请求中完成大量工作。虽然一个或五个图像可能不会产生超时,但数百条消息肯定会产生超时。根据上面提供的代码,您可以在一个请求中执行以下操作:

  • 上传[n]图像
  • 发出http请求以获取每个图像
  • 调整每个图像的大小(可能为4种不同的大小,从示例中不完全清楚)
  • 将每个图像的每个操纵版本上载到S3
  • 这是大量的工作,特别是考虑到cfhttp和更具体地说,cfimage都不是语言中最快的标记。通过cfimage进行图像处理可能非常慢

    您最好按照您的建议执行:将这些任务分开,在后端执行尽可能多的处理,这样原始客户请求就不必等待。您可以进行初始图像上传,然后结束客户请求,通知他们可能需要几分钟才能处理所有图像


    然后,您可以选择使用计划任务或任务队列(即rabbitmq)进行图像处理并上传到S3。我甚至建议您使用一个单独的实例来处理计划的任务,这样就不会在客户直接与您的web应用程序交互的实例上完成此处理工作。将图像处理和S3上载分解为单独的任务可能更好,这样您就可以进行错误处理来捕获图像处理的问题(即,错误的文件格式),而不必中断S3上载过程。这需要在后端进行更多的跟踪工作(即,哪些图像仍然需要处理,哪些图像仍然需要上传到S3),但这并不难实现,总体上为您提供了一个更健壮的工作流设置。

    如果您希望用户触发请求,您可以通过AJAX调用来完成,而不必等待回复。只需告诉用户请求正在后台运行。您还可以使用cfthread启动大请求,同时完成页面线程并显示“正在处理的请求”页面


    嗯,我喜欢这个主意。你能告诉我如何在变量中存储100个查询吗?以前从未这样做过。Thx到目前为止。@frequent:我是在内存中完成的(不再使用CF编码),只是创建一个变量,并用分号将查询存储在其中。然后每隔100个循环,将变量的值转储到cfquery中。正如我所记得的,你需要使用单引号。另外,谢谢。是的,我正在从上传的图像创建4个尺寸。我仍然不确定上传图片的最佳方式是什么。我的进程正在运行,但需要一段时间(旁注:我已经放弃告诉用户,5MB图像不适合上传或使用,我很高兴图像位于正确的文件夹中;-)不过我想我最终还是会将进程移动到
    cfschedule
    中,稍后再运行它。兔子对这有好处吗?有一件事我不确定,那就是把它分解成不同的任务。如果我在调度,我还可以运行整个批处理。Rabbit MQ是一个任务队列。它对于将任务放入队列、跟踪状态以及在任务完成后将其从队列中删除非常有用。如果您要创建一组真正分解的服务(即,将映像验证、调整大小、上载到S3以及向客户发送通知分解为单独的服务),Rabbit MQ可能会有很大帮助。不过你是对的:你可以把它作为一个单独的计划任务来完成。拆分代码的好处在于,在需要时可以很容易地交换代码,并且更容易处理错误。
    <cfif isdefined("artikel_uploaden")>
    <cfscript>
            S3 variables
    </cfscript>
    
        <!--- get img paths to upload --->
        <cfquery datasource="db" name="img_paths">
        SELECT DISTINCT imgpath
    </cfquery>
    
        <cfif img_paths.recordcount GT 0>
            <cfloop query="img_paths">
                <cfif img_paths.typ NEQ "img">
                    <cfset variables.testFilePath = img_paths.bildpfad & img_paths.bilddateiname>
                    <cfset variables.fileExt = ListLast(variables.testFilePath, ".")>
    
    
                    <!--- get image --->
                    <cfhttp timeout="45" 
                        throwonerror="no" 
                        url="#variables.testFilePath#" 
                        method="get" 
                        useragent="Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12" 
                        getasbinary="yes" 
                        result="variables.objGet">
    
                    <!--- validate --->
                    <!--- upload 4 sizes (s,m,l,xl) to S3 --->          
                    <cftry>
                        <cfset objImage = ImageNew(variables.objGet.FileContent )>
                        <cfimage source="#objImage#" action="write" quality=".99" destination="#variables.tempDirectory#_base_#img_paths.bilddateiname#" overwrite="yes">
                        <cfset variables.basePath = variables.tempDirectory & "_base_" & img_paths.bilddateiname>
                        <cfimage action="read" source="#variables.basePath#" name="base">
                        <cfset variables.imageSrc = variables.tempDirectory>
                        <cfscript>
                            if ( ImageGetWidth( base ) LT ImageGetHeight( base ) ) {
                            // portrait                                     
                            } else {
                            // landscape/square
    
                            }
                            // cleanup
                        </cfscript>
    
                        <!--- create IMG entry in media table  --->
                        <cfquery datasource="db"></cfquery>
                    </cfif>
                <cfcatch>
                    <cfset variables.errorCount = variables.errorCount+1>
                    <cfset variables.failedLoads = variables.failedLoads & img_paths.bilddateiname & "  (" & tx_pop_error & ":" & tx_errors_import_ext & "), ">
                </cfcatch>
            </cftry>
        </cfif>
      </cfloop>
      <!--- alert on success and errors --->
    </cfif>