2009-10-25 106 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

相關問題