我一直在研究一个允许用户异步上传图像的脚本。
该脚本包含几段代码,虽然它的大部分工作就像一个魅力,但我在尝试将冷融合图像对象转换为 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">
以及设置 ImageNew ,但是我可以看到一切都是一样的。二进制和图像对象之间有区别吗!?
编辑
- 我是否正确地将二进制对象传递到数据库中?
- 二进制和图像对象有什么区别!?我可以看到这两个在使用 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,如果你问我,这仍然很大,最终会导致你指出的(更慢的数据库响应时间,缓慢的备份等)即使我们只有两列 ID 和图像(longblob)。
也就是说,上面的代码压缩(同时调整大小)说 900KB 图像到 200-300kb,如果你问我,这仍然很大,最终会导致你指出的(更慢的数据库响应时间,缓慢的备份等)即使我们只有两列 ID 和图像(longblob)。