【问题标题】:ColdFusion query.removeRows ignores <cfif> statements and removes all resultsColdFusion query.removeRows 忽略 <cfif> 语句并删除所有结果
【发布时间】:2015-05-22 17:23:29
【问题描述】:

此问题已不在标题范围内。我试图找到一种方法来确定从数据库中提取的 PDF 作为字节数组是否是只读的,然后从结果集中删除。我已将 getinfo 转储在只读文件和读/写文件上,并比较了属性,发现没有明显的差异。我一直在谷歌搜索其他方法,但现在我被卡住了。

我正在尝试过滤 PDF 结果集并删除任何受密码保护的内容。我根据结果集的长度将索引循环递减为 1,并将每个 PDF(行)与 IsPDFFile() 函数进行比较。如果比较为假,则不应删除该行。使用removeRows 语句时,&lt;cfif&gt; 似乎被忽略,并且每一行都被不加选择地删除。

<cfloop index="i" from='#getScans.recordcount#' to='1' step="-1" >
    <cfset pdfDoc = getScans.ATTACHED_DOCUMENT_FILE[i]>
    <cfif NOT IsPDFFile("#pdfDoc#")> <!--- or <cfif NOT IsPDFObject("#pdfDoc#")>  --->
        <cfSet getScans.removeRows(i -1, 1)>
    </cfif>
    <cfoutput> #getScans.recordcount# </cfoutput>
</cfloop>

我在网上几乎找不到与我的问题相关的内容。如果有人能提供一些意见,那就太好了!

更新:

我发现IsPDFFile() 总是返回假。它不会将任何输入识别为 pdf。所以我的问题不是我最初认为的那样。在尝试处理从 SQL 服务器返回的 PDF 时,我不断收到 ByteArray 错误。

尝试将 BLOB 与任何 PDF 进行比较时出现的错误是:“ByteArray 对象无法转换为字符串。-从 Application.cfc 调用事件处理程序方法时发生异常。方法名称是:... "

...当我尝试使用 getinfo 时,也会抛出错误:“在 cfpdf 标签中的 GETINFO 操作期间发生错误。错误:com.adobe.internal.pdftoolkit.core.cos.CosNull 无法强制转换到 com.adobe.internal.pdftoolkit.core.cos.CosDictionary 包含或处理的文件的具体顺序是:..."

我想做以下事情:

执行从数据集中删除 PDF 的代码等。

这不起作用。 getinfo 行出错。是我的语法错误,还是我的用法不合适?

【问题讨论】:

  • 您确定要针对您删除的每个非 PDF 文件向浏览器发送警报吗?这很快就会变得非常烦人。就像...在第一个之后。
  • 当然!警报仅用于调试。我发现 IsPDFFile() 函数在这里也不合适。 pdf 来自 db 作为 ByteArray 数据,比较总是返回 false。我现在尝试使用
  • 确保您的问题中的代码与您的故障排除导致您的位置保持同步,并解释您的进度。可能值得搜索“coldfusion storage pdf if db”并阅读需要做什么来将字节数组数据转换为实际的 PDF 二进制文件
  • 另外,虽然我们可能从错误的 description 中找出了问题,即“..getting a ByteArray error”,但最好发布 实际的错误消息本身。
  • Stack Overflow uses a Q&A format。因此,与讨论论坛不同,它通常是每个线程一个问题。关于原始问题的观点是有效的。如果您现在面临不同的问题,您应该打开一个单独的线程。请务必解释在这种情况下“只读”是什么意思,因为它是一个通常与物理文件相关联的术语,而不是二进制数据。

标签: sql-server coldfusion coldfusion-9


【解决方案1】:

每次执行cfset 时,您都会查看查询中的第一个 PDF 文档。您需要在查询中引用当前行 i

<cfset pdfDoc = getScans.ATTACHED_DOCUMENT_FILE[i]>

您可以在 PDF 上getInfo 并检查返回的结构中的加密字段。我不确定返回的所有选项,但未加密的 PDF 为我返回了 No Security。

<cfpdf action="getinfo" source="abs/relative path" name="result">
<cfif result.encryption NEQ 'No Security'>
  <cfSet getScans.removeRows(i -1, 1)>
</cfif>

【讨论】:

  • 只是为了澄清,遍历需要实现的数据集,你在那里是绝对正确的。但是,这并不能解决位数组错误。我仍然无法检查 PDF 是否加密。
  • @James 检查了我通过谷歌搜索找到的更新答案并创建了一个测试页面来检查输出
  • 谢谢,这实际上似乎让我使用 getinfo 加密。我正在检查的文件是只读的,并且通过了我认为不应该的加密测试。您是否碰巧知道可以确定天气的测试文件是否为只读文件?
【解决方案2】:

除了关于查询引用的 cmets 之外。在这种情况下,这可能是错误的功能。顾名思义,IsPDFFile(path) 需要一个文件路径。由于听起来您正在传递 PDF 的 二进制,因此您想改用 IsPDFObject(value)。

值:一个值,通常是存储为变量名的 PDF 对象。

返回:如果该值返回有效的 PDF 文件,则为真。否则为假。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多