【问题标题】:insert into DB and output blob images using Coldfusion 10使用 Coldfusion 10 插入数据库并输出 blob 图像
【发布时间】:2013-09-14 21:16:19
【问题描述】:

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

该脚本包含几段代码,虽然它的大部分工作都像一个魅力,但我在尝试将冷融合图像对象转换为 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图像?

也就是说,我将在服务器端输出第一张 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 转换为字符串的最佳方法是什么...我应该使用 writeToBrowser 吗?我真的对 CF 和 blob 中的图像函数没有太多经验,所以如果你能帮我解决一下,我将不胜感激:)

编辑

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

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

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

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

【问题讨论】:

  • (编辑)您在这里的实际问题是什么? :) 如何存储图像,检索它们,显示它们,...? (顺便说一句,如果您的问题与数据库查询有关,您需要告诉我们您使用的是哪个 DBMS(和版本)。)
  • 签出 EDIT :) 差点忘了,我一直在使用 MySQL 5.5

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


【解决方案1】:

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 - 将二进制数据写入磁盘上的临时文件并为您生成一个&lt;img&gt; 标签。如果您使用该标签,并查看源代码,您会看到它生成如下内容:

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

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

了解更多信息的好方法是全部尝试。查看每个函数的文档,运行一些测试代码,然后检查生成的 html 的“查看源代码”。这将使您对它们各自的工作方式有一个很好的了解。

【讨论】:

  • 首先感谢您的详细回复,非常感谢 :)
  • 现在,有没有办法在将图像插入数据库之前额外压缩图像而不会显着降低应用程序的速度。
  • 我已经测试了所有可用的 CF 图像大小调整算法,可以说最终图像大小没有太大差异。那么在继续插入数据库之前如何进一步压缩图像。
  • 我的伙伴一直坚持使用 blob 他们选择 blob 而不是文件系统的原因是什么? (就个人而言,我总是将图像存储在磁盘上。)我更熟悉 SQL Server,但知道 MySQL 它提供了压缩功能以及压缩选项。但是,这是一个额外的步骤,因此它显然会增加 一些 时间(就像通过网络将 blob 从数据库中拉出一样)。如果您的合作伙伴是 dba,您应该与他讨论将影响降至最低的最佳方式。
  • 好的,我会和他核实一下。另一方面,有没有办法用 CF 稍微压缩图像。我会满意额外的 20-30%
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多