ColdFusion: как получить имя файла неудачной загрузки - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь поместить имя файла неудачной загрузки в электронное письмо внутри try / catch, но мне не повезло.

На основании этой документации - FileUploadAll () - Я решил, что собираюсь использовать ошибку.

<cftry>
    <cffile destination="#FULLPATH#" action="upload" nameconflict="ERROR" continueOnError="true" filefield="FileName" />
    <cfcatch type="Any" >
        <cf_EmailHandler from="testmail@gmail.com" to="testmail@gmail.com" subject="Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#">
            <CFOUTPUT>
                Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#
                Cannot upload the following file:
                #FULLPATH# #ArrayLen(cffile.uploadAllErrors)#
            </CFOUTPUT>
        </cf_EmailHandler>
        <b>Error:</b>File already exists.
        <cfabort>
    </cfcatch>
</cftry>

Я получаю следующую ошибку:

Элемент UPLOADALLERRORS не определен в CFFILE

Поэтому я пытаюсь исправить это:

<cftry>
    <cffile destination="#FULLPATH#" action="upload" nameconflict="ERROR" Errors="errorResult" continueOnError="true" filefield="FileName" />
    <cfcatch type="Any" >
        <cf_EmailHandler from="testmail@gmail.com" to="testmail@gmail.com" subject="Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#">
            <CFOUTPUT>
                Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#
                Cannot upload the following file:
                #FULLPATH# #ArrayLen(errorResult.uploadAllErrors)#
            </CFOUTPUT>
        </cf_EmailHandler>
        <b>Error:</b>File already exists.
        <cfabort>
    </cfcatch>
</cftry>

Тогда я получаю:

ЭлементUPLOADALLERRORS не определен в ERRORRESULT.

Есть идеи о том, что я делаю неправильно, или другой способ отобразить имя неудачной загрузки?Также я использую ColdFusion 11.

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Обновление:

Отчет об ошибке CF-4204290 в настоящее время указывает на эту проблему как «Исправить».

TL; DR;

Это ошибка документации. Атрибут continueOnError не поддерживается с action = upload . Вместо этого используйте action = uploadAll . Имейте в виду, что uploadAll поддерживает несколько файлов, поэтому результаты будут возвращены в виде массива структур.


Причина, по которой он не работает, заключается в том, что код использует неправильное «действие». Это должно быть action = "uploadAll" . Поскольку вы используете continueOnError="true", CF заполняет структуру любыми возникающими ошибками. По умолчанию он использует CFFILE, но вы можете указать другое имя переменной с помощью атрибута errors.

<cffile destination="c:/some/path/" 
    action="uploadAll" 
    nameconflict="ERROR" 
    continueOnError="true" 
    filefield="file_path" />

Обновление:

Как указано в комментариях, документация делает говорит continueOnError является поддерживаемым атрибутом для action = upload . Тем не менее, IMO это ошибка документации. Adobe, вероятно, просто скопировал текст из описания действия = uploadAll.

Интересно, что документация для FileUpload () вообще не содержит этого атрибута. Отчет об ошибке CF-4199503 подтверждает, что версия функции не поддерживает ее. Основываясь на моих тестах ниже с CF11 и CF2016, я пришел к выводу, что они не поддерживаются ни в одной из версий.


Тестовое действие = UploadAll

Загрузка файла, который уже существует в каталоге назначения, не вызывает серьезной ошибки. CF заполняет указанную переменную сведениями об ошибках и выводит их на экран:

<cfif structKeyExists(FORM, "submit")>
    <cffile destination="c:/temp" 
        action="uploadAll" 
        nameconflict="ERROR" 
        continueOnError="true" 
        errors="myErrors"
        filefield="file_path" />

    <cfdump var="#cffile#" label="cffile">
    <cfdump var="#myErrors#" label="errors">
</cfif>

<form  method="POST" 
    enctype="multipart/form-data">
    <input type="file" name="file_path">
    <input type="submit" name="test">
</form>

Результаты: Screenshot of Action UploadAll results

Тестовое действие = Загрузить

Измените действие на action="upload", и код завершится ошибкой. ColdFusion НЕ:

  • Продолжить обработку после ошибки .. или
  • Заполните cffile информацией об ошибке ... или
  • Создать переменную результата, названную атрибутом errors

Результаты:

Screenshot of Action Upload Results

Обратите внимание, опускание необязательного атрибута errors приводит к тем же результатам. Он работает, как и ожидалось, при использовании action = uploadAll и завершается ошибкой при использовании action = upload

0 голосов
/ 04 мая 2019

На странице формы я захватил имя файла, используя JavaScript

<Input Name="FileName" type="file" size="#TEXT_AREA_WIDTH#"><br><br>
<Input type="Hidden" id="READ_FILE_NAME" name="READ_FILE_NAME" value="">
<Input type="Submit" name="Operation" value="Save" onclick="return validateAttachmentForm(this.form.FileName.value)">&nbsp;

function validateAttachmentForm(file_name)
{
  if (file_name.lastIndexOf("\\" != -1)) {
    var file_name = file_name.substring(file_name.lastIndexOf("\\") + 1, file_name.length);
  }

  document.getElementById("READ_FILE_NAME").value = file_name;

  if(file_name != "")
  {
    return true;
  } else{

    alert('Please select a file to upload.')
    return false;
  } 
}

На следующей странице я просто отображаю имя файла, переданное в

<cftry>
    <cffile destination="#FULLPATH#" action="upload" nameconflict="ERROR" Errors="errorResult" continueOnError="true" filefield="FileName" />
    <cfcatch type="Any" >
        <cf_EmailHandler from="testmail@gmail.com" to="testmail@gmail.com" subject="Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#">
            <CFOUTPUT>
                Attachment Error - #BUILD_SEARCH.PROJECT_VERSION# #BUILD_SEARCH.BUILD_NUMBER#
                Cannot upload the following file:
                #FULLPATH#\#form.READ_FILE_NAME#
            </CFOUTPUT>
        </cf_EmailHandler>
        <b>Error:</b>File already exists.
        <cfabort>
    </cfcatch>
</cftry>
...