ColdFusion: получить имя файла перед загрузкой - PullRequest
10 голосов
/ 14 мая 2009

Как я могу получить имя файла файла, прежде чем я вызову

<cffile action = "upload">

? Я могу получить имя файла временного файла, но не фактическое имя файла. В PHP земле я могу использовать суперглобальный $ _FILES, чтобы получить то, что я хочу - но, насколько я могу судить, такого не существует в ColdFusion.

Я могу получить имя файла на стороне клиента, но очень хотел бы сделать это на стороне сервера.

Спасибо

Ответы [ 8 ]

15 голосов
/ 04 декабря 2012

Да, это возможно. Вы можете использовать эту функцию, чтобы получить имя файла клиента перед использованием тега cffile:

<cffunction name="getClientFileName" returntype="string" output="false" hint="">
    <cfargument name="fieldName" required="true" type="string" hint="Name of the Form field" />

    <cfset var tmpPartsArray = Form.getPartsArray() />

    <cfif IsDefined("tmpPartsArray")>
        <cfloop array="#tmpPartsArray#" index="local.tmpPart">
            <cfif local.tmpPart.isFile() AND local.tmpPart.getName() EQ arguments.fieldName> <!---   --->
                <cfreturn local.tmpPart.getFileName() />
            </cfif>
        </cfloop>
    </cfif>

    <cfreturn "" />
</cffunction>

Подробнее здесь: http://www.stillnetstudios.com/get-filename-before-calling-cffile/

7 голосов
/ 14 мая 2009

Я не знаю, как выяснить это перед вызовом cffile, но может быть обходной путь.

Когда вы звоните <cffile action="upload">, вы можете указать результат, используя result="variable". Итак, вызовите загрузку с пунктом назначения как временный файл. Ваша переменная результата - это структура, которая содержит член clientFile, который является именем файла на клиентском компьютере.

Теперь вы можете использовать <cffile action="move">, чтобы сделать все, что вам нужно, с исходным именем файла.

7 голосов
/ 12 мая 2012

Я использую Railo и нашел оригинальные имена файлов с помощью:

GetPageContext().formScope().getUploadResource('your_file_input_form_name').getName();

Может быть, это работает и на сервере Adobe? Это очень удобно, если вы хотите как-то переименовать загруженный файл и не хотите, чтобы он перемещался через два временных каталога (см. Переименование файлов по мере их загрузки (как на самом деле работает CFFILE) )

2 голосов
/ 19 января 2010

ВАУ, я нашел отличное и простое решение! с небольшим JavaScript

Таким образом, вы получаете временное имя файла для загрузки файла и фактическое имя file.jpg для базы данных

<html>
<head>
<script type="text/javascript">
function PassFileName()
{
document.getElementById("fileName").value=document.getElementById("fileUp").value;
}
</script>
</head>
<body>
<form name="form1" method="post" enctype="multipart/form-data" >
File: <input type="file" name="fileUp" id="fileUp" size="20" onchange="PassFileName()" /> <br />
Title: <input type="text" name="Title" id="Title"><br />
<input type="hidden" id="fileName" size="20" name="fileName" />
<input type="submit" name="submit">
</form>
</body>
</html>
1 голос
/ 28 мая 2009

Вот как мы это делаем. В основном, есть поле файла и строковое поле. JavaScript извлекает имя файла из браузера перед отправкой формы. Очевидно, вам нужно убедиться, что имя файла на другом конце действительно присутствует (например, оно будет пустым, если у пользователя отключен JavaScript), и вам нужно будет проанализировать строку для обработки различий платформы (/users/bob/file.jpg против C:\Documents and Settings\bob\file.jpg)

<script>
    function WriteClientFileName(){
        $('ClientFileName').value = $('ClientFile').value;
    }
</script>

<form enctype="multipart/form-data" onsubmit="WriteClientFileName();">

    <input type="File" name="ClientFile" id="ClientFile">
    <input type="hidden" name="ClientFileName" id="ClientFileName" value="">

    <input type="submit">
</form>

Кстати, эта техника мультиязычна. Он будет одинаково хорошо работать в RoR, PHP, JSP и т. Д.

Редактировать: Если пользователь "владеет жестоким FireBug", в чем проблема? Даже если у них нет Firebug, они могут переименовать файл на своем конце и изменить ввод. Плюс, вы проверяете свои данные, верно?

0 голосов
/ 30 мая 2009

Нет способа узнать имя файла для загруженных файлов перед сохранением на сервере в ColdFuson, Railo или OpenBD. Я обычно генерирую «мое» новое имя файла, используя функцию createUUID () перед сохранением файла.

0 голосов
/ 14 мая 2009

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

Ответ Бен Дум, как правило, таков, как я к нему подхожу.

0 голосов
/ 14 мая 2009

Если у вас есть атрибут name, определенный в элементе управления вводом, имя файла будет в области FORM. Например:

<cfif not structIsEmpty(form)>
    <cfdump var="#form#">
<cfelse>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <form method="POST" action="#cgi.SCRIPT_NAME#">
            <input type="file" name="fileIn" />
            <input type="Submit" name="formSubmit">
        </form>
    </body>
    </html>
</cfif>
...