【问题标题】:Using ColdFusion to save an uploaded image to the server使用 ColdFusion 将上传的图像保存到服务器
【发布时间】:2010-12-09 19:51:57
【问题描述】:

我认为创建功能以允许用户将图片上传到服务器目录并寻求一些帮助是一项相对简单的任务,这让我感到困惑。

我有一个简单的表单,它有一个简单的界面,传递一个名为“imagedata”的变量,它是从文件输入传递的数据,一个名为“name”的变量,它是一个指定的图像名称,以及一个名为“imagetype”的变量它传递一个文件扩展名。

我在函数(处理程序)中用来保存这个文件的代码如下:

<cfset form.imageName = form.name & "." & form.imagetype />
...
<cffile action="write" file="#sitepath#storage/bannerImages/#form.imagename#" output="#form.imageData#" />

这显然行不通;它将以正确的名称保存文件,但不会正确保存文件并且不会呈现为图像。我认为这是相对简单的事情,我认为我忽略了一些事情,因为我在谷歌上没有找到任何东西,这很奇怪。对此问题的帮助将不胜感激。

【问题讨论】:

  • 您是否将数据视为文本而不是二进制?
  • 我不明白你的意思。正在上传的文件是从表单传递的。我没有对包含在表单结构中的变量中的数据进行任何处理。
  • 您需要对二进制文件使用“上传”来上传它们,而不是“写入”。

标签: image coldfusion file-upload cffile


【解决方案1】:

不要使用action="write",使用action="upload"

例子:

<cffile
    action       = "upload"
    fileField    = "ImageData"
    destination  = "/tmp/uploads"
    accept       = "image/jpg"
    nameConflict = "MakeUnique"
/>

这会将文件放在/tmp/uploads(例如在Windows 上使用d:/tmp/uploads)- 这是一个无法在线访问的目录

此时,您必须验证该文件是否与其声称的相同 - 具有适当尺寸和文件大小的图像文件,而不是经过掩码的 EXE 或 embedded ZIP

一旦您对文件可以安全地托管在您的服务器上感到满意,您就可以将其移动到适当的目录并将名称设置为所选择的名称。

类似...

<cfif cffile.FileWasSaved>

    <cfset UploadedFileName = cffile.ServerDirectory & '/' & cffile.ServerFile />

    <cfif NOT IsImageFile( UploadedFileName )>
        <cfthrow message="Uploaded file not an image." />
    </cfif>

    <!--- INFO: Checks if zip embedded in image. --->
    <cftry>
        <cfzip action="list" file="#UploadedFileName#" name="tmp"/>
        <cfthrow message="Embedded zip files not allowed."/>
        <!--- TODO: Verify correct exception type for CF: --->
        <cfcatch type="java.util.zip.zipexception"></cfcatch>
    </cftry>

    <!---
        TODO: Validate any necessary business rules
        (e.g. image not too large, etc)
    --->        

<cfelse>
    <cfthrow message="File Upload Error"/>
</cfif>


<cfif refind('\W',Form.Name)>
    <cfthrow message="Invalid Name specified. Only alphanumerics allowed."/>
</cfif>
<cfif NOT ListFindNoCase('PNG,JPG,GIF',Form.ImageType)>
    <cfthrow message="Invalid FileType specified. Must be PNG/JPG/GIF"/></cfif>
</cfif>

<cffile
    action      = "rename"
    source      = "#UploadedFileName#"
    destination = "#sitepath#storage/bannerImages/#Form.Name#.#Form.ImageType#"
/>

该代码未经测试,并且 - 与您在服务器上运行的所有内容一样,尤其是涉及客户端上传的代码 - 确保在使用之前了解它的作用。
Adobe LiveDocsvarious CF blogs 上有很多有价值的信息,值得花一些时间来消化。

【讨论】:

  • 如何使用用户指定的文件名保存文件?
  • 允许用户指定自己的文件名并将文件直接上传到 Web 可访问的位置是非常不安全的。有关详细信息,请参阅我的更新答案。
  • GetTempDirectory() 函数也可能有助于确定上传到的位置:livedocs.adobe.com/coldfusion/7/htmldocs/00000497.htm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 2011-12-14
相关资源
最近更新 更多