使用Coldfusion 10插入DB并输出blob图像

时间:2013-09-14 21:16:20

标签: coldfusion blob coldfusion-10 mysql-5.5 cfimage

我一直在研究一个允许用户异步上传图片的脚本。

该脚本包含几段代码,而大部分内容都像魅力一样,在尝试将coldfusion图像对象转换为blob时遇到问题,将其传递给另一个对象(cfc组件方法),将值插入到DB使用存储过程和最终输出blob图像来查看结果。

这是我遇到问题的特定细分市场的测试代码,最后一个会有点复杂:

<cfimage source="#CFFILE.ServerDirectory#\#CFFILE.ServerFile#" 
        name="Image" overwrite="no">
        <cfif ImageGetWidth(Image) lt 1024>
        <cfset ArrayAppend(set.Errors,"you can not add image that's less than 1024px wide")>
        <cfelse>

        <!---now resize image scale to fit (709px wide)--->
        <cfset ImageSetAntialiasing(Image,"on")>
        <cfset ImageScaleToFit(Image,709,"","highestPerformance")>

            <!---now crop image if height is more than 350px--->  
            <cfif ImageGetHeight(Image) gt 350>
            <cfset yPosition  = (ImageGetHeight(Image) - 350) / 2>
            <cfset ImageCrop(Image, 0, yPosition, ImageGetWidth(Image), 350)>
            </cfif>

        </cfif>
   </cfif>

   <cfif ArrayLen (set.Errors) is 0>
   <cfset testAddImage = testImg.AddImage(finalImage=#ImageGetBlob(Image)#)>
   </cfif>

需要承认,CF没有使用太多的图像功能,因此我必须学习一些技巧。无论如何,正如我所看到的,这个测试代码显然可以正常工作,因为每次提交表单时都会将所有值都整齐地添加到数据库中,并且不会抛出CF或客户端错误。另一方面,虽然我阅读了很多关于输出blob的内容,但我很担心用CF 10实现这一目标的最佳方法是什么,我应该使用cfcontent,binaryEncode,字符串或其他东西来做正确的事。

我也尝试过设置二进制对象,

<cffile action = "readBinary" file = "#CFFILE.ServerDirectory#\#CFFILE.ServerFile#" variable = "Image">

以及设置ImageNew,但是我可以看到一切都是一样的。二元和图像对象之间有区别!?

修改

  1. 我是否正确地将二进制对象传递到数据库中?
  2. 二元和图像对象有什么区别!?因为我可以看到这两个看起来相同,当返回JSON并显示在客户端(警报)。 3.最重要的问题是如何输出blob图像?
  3. 说,我将输出第一个X图像(比如第一页)服务器端,并允许用户使用jquery AJAX调用加载更多。

    对于服务器端我会有这样的事情:

    <cfset sqlQueries = createObject ("component","cfc.sqlQueries")>
    <cfset loadImages = sqlQueries.LoadImagesDB(orderBy="Date")>
    <cfoutput query="loadImages">
    #image# - how to display blob images here
    </cfoutput>
    

    获取blob图像的最佳方法是什么,cfcontent,binaryEncode,string ...我应该使用writeToBrowser吗?我真的对CF和blob中的图像功能没有多少经验,所以如果你能帮助我解决它,我真的很感激:)

    修改

    @Leigh “了解更多信息的好方法是尝试所有这些。”当我在等人回复时,我已经阅读并测试了上述所有CF功能,并得出结论(你也指出)动作= writeToBrowser是一种方式,因为它表现很好,更具体地说就是它可以在此过程中压缩图像。

    “数据库存储明显不利于它可以大大增加数据库的大小”谢谢你提出这个问题,这是我最关心的问题。我会亲自将图像存储在文件夹中,但我的伙伴(顺便说一句是DB专家)一直坚持使用blob,尽管他一直在敦促我尽可能地压缩图像,同时保持性能。

    说,上面的代码压缩(调整大小时)说900KB图像到200-300 kb,如果你问我,它仍然会变大,最终会导致你指出的内容(较慢的数据库响应时间,较慢的备份等) )即使我们只有两列ID和图像(longblob)。

    说,上面的代码压缩(调整大小时)说900KB图像到200-300 kb,如果你问我,它仍然会变大,最终会导致你指出的内容(较慢的数据库响应时间,较慢的备份等) )即使我们只有两列ID和图像(longblob)。

1 个答案:

答案 0 :(得分:3)

  

1。我是否正确地将二进制对象传递到数据库中?

要回答这个问题,我们需要查看将图像添加到数据库的函数的实际代码,并知道您用于目标列的数据类型(blob,longblob,..)。

另外,如果您不熟悉在数据库中存储blob,那么您应该权衡database versus file system storage的优缺点。两者都有缺点,但数据库存储的一个明显缺点是它可以大大增加数据库的大小,特别是在存储大图像时。

  

2。二元和图像对象有什么区别?

CF图像对象只是二进制图像数据的包装。包装器包含二进制数据,以及调用任何内置图像标记/函数时CF服务器使用的一些额外(CF特定)方法。

  

3。如何输出blob图像?获取blob图像,cfcontent,binaryEncode,字符串的最佳方法是什么?我应该使用writeToBrowser吗?

最好是亲戚。除toString()外,任何这些方法都可用于显示图像。这一切都取决于你想要显示它们的方式和位置。在这种情况下,使用action=writeToBrowser可能是最简单的。 source可以是CF图像对象,也可以是图像的原始二进制文件。

  • action=writeToBrowser - 将二进制数据写入磁盘上的临时文件,并为您生成<img>标记。如果您使用标记并执行视图源,您将看到它生成如下内容:

     <img src="/CFFileServlet/_cf_image/_cfimgxxxx.PNG" alt="" />
    
  • cfcontent通常用于返回单个文件,例如用于文件下载。它也可以与内联图像一起使用,但是会涉及一个单独的脚本,它返回带有<cfcontent>的二进制图像。然后,单独的脚本将用作内嵌图像标记<img src="somePageWithCFContent.cfm?param=...." />

  • 的来源
  • binaryEncode(binary, encoding)可用于embed an image as base64。 (更适合较小的图像,浏览器支持各不相同)。

了解更多内容的好方法是尝试所有这些。查看每个函数的文档,运行一些测试代码,然后检查生成的html的“查看源代码”。这将使您很好地了解每个工作方式。