Использование ColdFusion для сохранения загруженного изображения на сервер - PullRequest
0 голосов
/ 25 октября 2009

Меня сбивает с толку то, что я считаю относительно простой задачей создания функциональности, позволяющей пользователям загружать изображения в каталог сервера, и мне нужна помощь.

У меня есть простая форма с простым интерфейсом, передающая переменную с именем 'imagedata', которая является данными, переданными из файлового ввода, переменную с именем 'name', которая является указанным именем изображения, и переменную с именем 'imagetype' который передает расширение файла.

Код, который я использую в функции (обработчике) для сохранения этого файла, выглядит следующим образом:

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

Это, очевидно, не сработает; он сохранит файл с правильным именем, но не сохранит файл правильно и не отобразит изображение. Я думаю, что это что-то относительно простое, и я думаю, что я что-то упустил, потому что я ничего не нашел в Google, что странно. Помощь с этой проблемой будет оценена.

1 Ответ

8 голосов
/ 25 октября 2009

Не используйте action="write", используйте action="upload".

Пример:

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

Это поместит файл в /tmp/uploads (используйте, например, d:/tmp/uploads в Windows) - это каталог , недоступный онлайн .

На этом этапе вы должны убедиться, что файл соответствует тому, что он утверждает - файл изображения с соответствующими размерами и размером файла, а не заархивированный EXE-файл или встроенный 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 LiveDocs и о различных блогах CF , которые стоит потратить некоторое время на переваривание.

...