#coldfusion
#coldfusion
Вопрос:
У меня есть функция, которая генерирует файл Excel (используя функции электронных таблиц ColdFusion) и сохраняет результат как ReportContent
.
Мне нужно отправить этот отчет группе людей, использующих <cfmail>
:
<cfmail from="#From#" to="#To#" subject="#Subject#" type="html" >
<cfmailparam content="#ReportContent#" type="application/vnd.ms-excel" file="#FileName#" >
#Body#
</cfmail>
Моя проблема в том, что при тестировании я обнаружил, что <cfmail>
команда часто выполнялась до того, как файл Excel был полностью отрисован, прикрепляя вместо этого непригодный .tmp
файл.
Я попытался справиться с этим, приостановив выполнение на 5 секунд, давая файлу Excel время для отображения:
<cfscript>
thread = CreateObject("java", "java.lang.Thread");
thread.sleep(5000);
</cfscript>
Это срабатывало в большинстве случаев, но не в 100% случаев. Теперь я увеличил задержку до 15 секунд — что работает для моих текущих тестов, но я не уверен, что это лучшая стратегия.
Есть ли способ подтвердить, что файл Excel в ReportContent
полностью отрисован перед вызовом <cfmail>
?
Комментарии:
1. это беспокоит, у меня есть похожая вещь, но создается pdf-файл, который затем отправляется по электронной почте, хотя пока у нас не было никаких проблем…
2. Вы могли бы включить
FileExists()
функцию, чтобы убедиться, чтоcfmail
команда запускается только после явной проверки ожидаемого вывода и расширения. Если он не готов, повторяйте проверку каждые 5 секунд или около того. Похоже, вы хорошо разбираетесь в потоковой обработке; если ваша единственная проблема — это время, это можно было бы исправить.3. Вы генерируете файл и вызываете cfmail в одном и том же скрипте? Что вы используете для сохранения сгенерированного отчета в #FileName #?
4. Основываясь на моем быстром прочтении документации по параметру cfmail, я думаю, что он пытается использовать переменную в качестве вложения электронной почты, фактически не создавая файл.
5. я добавлю в @TRose. Вы можете отправить файл в каталог, и после того, как он будет создан, отправить его по почте, а затем удалить. Если только вам не нужно сохранить документы.
Ответ №1:
Используйте именованную блокировку, подобную этой, и посмотрите, поможет ли это:
<cflock name="some_preferably_unique_lock_name" type="exclusive" timeout="60">
<!--- code that creates and writes the Excel file to disk --->
</cflock>
<cflock name="same_preferably_unique_lock_name" type="exclusive" timeout="60">
<!--- code that mails the Excel file as attachment --->
</cflock>