插入数据库并使用 Coldfusion 10 输出 blob 映像



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

该脚本包含几段代码,虽然其中大部分工作方式类似于魅力,但我在尝试将 Coldfusion 图像对象转换为 blob、将其传递给另一个对象(CFC 组件方法)、使用存储过程将值插入数据库并最终输出 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">

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

编辑

  1. 我是否正确将二进制对象传递到数据库中?
  2. 二进制和图像对象有什么区别!? 正如我所看到的,当使用 JSON 返回并在客户端(警报)上显示时,这两个看起来是一样的。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、二进制编码到字符串的最佳方法是什么?我应该使用写到浏览器吗?我真的对 CF 和 blob 中的图像函数没有太多经验,所以如果您能帮我整理一下:),我将不胜感激

编辑

@Leigh"了解更多的一个好方法是尝试所有方法。" 当我在这里等待有人回复时,我已经阅读并测试了上述所有 CF 功能,并得出结论(您还指出)action=writeToBrowser 是要走的路,因为它表现得很好,更具体地说,因为它可以在此过程中压缩图像。

"数据库存储的明显缺点是它可以大大增加数据库的大小"谢谢你提出这个问题,这是我最大的担忧。我个人会将图像存储在文件夹中,但我的合作伙伴(顺便说一下,他是数据库专家)一直坚持使用 blob,尽管他一直在敦促我在保持性能的同时尽可能多地压缩图像。

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

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

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

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

此外,如果不熟悉如何在数据库中存储 Blob,则绝对应该权衡数据库与文件系统存储的优缺点。两者都有缺点,但数据库存储的一个明显缺点是它可以大大增加数据库的大小,尤其是在存储大型图像时。

阿拉伯数字。二进制对象和图像对象有什么区别?

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

3 .如何输出 blob 图像?获取 blob 图像、cfcontent、二进制编码到字符串的最佳方法是什么?我应该使用writeToBrowser吗?

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

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

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

  • 二进制
  • 编码(二进制,编码) 可用于将图像嵌入为 base64。(更适合较小的图像,浏览器支持各不相同)。

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

最新更新