2009-10-25 107 views
0

我被我认为是创建功能的相对简单的任务所阻碍,该功能允许用户将图片上传到服务器目录并正在寻求帮助。使用ColdFusion将上传的图像保存到服务器

我有一个简单的接口,传递一个名为'imagedata'的变量,该变量是从文件输入传递的数据,名为'name'的变量是指定的图像名称,以及名为'imagetype '通过文件扩展名。

我使用的功能(处理),以保存该文件中的代码如下:

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

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

+0

您是否将数据视为文本而不是二进制文件? – phoebus 2009-10-25 00:29:33

+0

我不知道你的意思。正在上传的文件正在从表单传递。我没有对结构中包含在变量中的数据进行处理。 – 2009-10-25 00:36:22

+0

您需要使用“上传”二进制文件来上传它们,而不是“写入”。 – phoebus 2009-10-25 01:17:48

回答

8

请勿使用action="write",请使用action="upload"

例子:

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

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

此时,您必须验证该文件是它自称的文件 - 具有适当尺寸和文件大小的图像文件,而不是被屏蔽的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有很多有价值的信息值得花费一些时间消化。

+0

这将如何用用户指定的文件名保存文件? – 2009-10-25 00:49:10

+2

允许用户指定他们自己的文件名并将文件直接上传到网络可访问的位置是非常不安全的。查看我更新的答案以获取更多详情。 – 2009-10-25 12:28:40

+2

GetTempDirectory()函数在确定要上传到的位置时可能也很有用:http://livedocs.adobe.com/coldfusion/7/htmldocs/00000497.htm – 2009-10-25 15:10:47

相关问题