如何防止多文件上传ColdFusion的时机



我有一个自动例程,用户可以触发该图像上传到Amazon S3。用户通常会上传> 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函数,触发我的上传(sans详细信息):

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

这可以正常工作,但是如果图像数太大,浏览器只是挂断/挂断,所以我通常会查看从未完成且未警告成功/错误的加载屏幕。

问题
如何处理这样的大文件上传是什么更好的选择?例如,这是否应该进入cfschedule,以便可以在后台运行?

感谢提示!

您正在尝试在一个请求中做很多事情。虽然一个或五个图像可能不会产生超时,但数百条消息肯定会产生超时。从您上面提供的代码中,您正在单个请求中执行以下操作:

  1. 上传[n]图像
  2. 提出HTTP请求以获取每个图像
  3. 调整每个图像的大小(可能分为4种不同尺寸,从样本中不完全清楚)
  4. 将每个图像的每个操纵版本上传到S3

这是很多工作,尤其是考虑到CFHTTP和更具体地说,CFImage并不是语言中最快的标签。通过Cfimage进行的图像操作可能很慢。

您可能会更好地做您建议的事情:将这些任务分开并在后端进行大量处理,以便原始客户的请求不必等待。您可以上传初始图像,然后结束客户请求,并通知他们处理所有图像可能需要几分钟。

然后,您可以选择使用计划的任务或任务队列(即;兔子MQ)进行图像处理并上传到S3。我什至建议您有一个单独的实例来处理计划的任务,因此在客户直接与Web应用程序进行交互的情况下,该处理工作尚未完成。打破图像操作,S3上传到单独的任务甚至更好,以便您可以使用错误处理以捕获图像操作(即;不良文件格式)的问题,而无需bork bork bork bork ot bork s3上传过程。这需要在后端上进行更多跟踪工作(即;哪些图像仍然需要处理,这些图像仍然需要上传到S3),但这并不难实现,并为您提供了更强大的工作流程设置。

<</p> <</p>

您正在循环通过CFQUERY,这很糟糕,可能会导致重大放缓。解决此问题的一种方法是将100个查询存储到一个变量中,然后一次运行多个查询(这是连接的开放和关闭,可能需要很长时间。)当我过去使用此样式进行质量更新时,将获得提高90%的提高速度。

这可能足以使您的流程正常工作。当然,如果您有很多非常大的图像,那么对此无关(限制图像大小除外)

如果您希望用户触发该请求,则可以使用Ajax调用,而只是不等待回复。只需告诉用户该请求在后台运行即可。您也可以在完成页面线程并显示"过程中的请求"页面时使用cfthread来启动大型请求。

问本:用Coldfusion中的CFThread处理文件

相关内容

  • 没有找到相关文章

最新更新