ColdFusion - необходимо пройтись по папке, чтобы найти конкретные файлы из запроса SQL и скопировать или заархивировать их во временную папку
Я пытаюсь перебрать папку на сервере, чтобы получить список определенных файлов, а затем скопировать эти файлы во временный каталог или заархивировать и скопировать во временный каталог. Однако я продолжаю врезаться в стену, поскольку я не уверен, как это сделать. (Еще любитель с ColdFusion)
поэтому здесь я делаю SQL-запрос, в котором извлекаю точные вложения из определенных дат, которые я ищу:
<cfquery name="test" datasource="test" cachedwithin="#CreateTimeSpan(0,0,10,0)#" result="r">
SELECT Test.TestNum, Test1.Test1Date, TestReport.Attachment
FROM Test
INNER JOIN more SQL code here..
WHERE Test1.Test1Date >= '#daterangevariablehere#'
AND NOT more SQL code here as well..
ORDER BY Test.TestNum
</cfquery>
SQL-запрос корректен, как и в SQL Server Mgmt Studio, он работает правильно, и даже перед тем, как я попытаюсь сделать cfdump, он показывает правильный список файлов, которые я пытаюсь получить. Однако, когда я пытаюсь просмотреть их, чтобы скопировать или заархивировать, это полный провал -> пустая страница.
Я пытался:
<cfloop query="test">
<cfif test.recordcount gt 0>
<cfzip action="zip" file="#LocationOfwhereIwantTheEndResult" source="#WhereTheFolderWithTheAttachmentsReside#">
</cfzip>
</cfloop>
Я даже пытался сделать это, обернутый вокруг кода выше:
<cfdirectory action="list" name="test" directory="#WhereTheFolderWithTheAttachmentsReside#"></cfdirectory>
Примечание: некоторые переменные и код созданы для безопасности и анонимности... но я хотел показать структуру того, что я пытаюсь достичь, я надеюсь, что я ясно (!), Если в противном случае, пожалуйста, дайте мне знаю, и я предоставлю более подробную информацию или информацию. ЛЮБАЯ помощь очень ценится, я бился головой об стену и чувствую, что это может быть что-то очень простое. Пожалуйста помоги!:)
2 ответа
Не зная реальных значений, похоже, что ваш запрос содержит абсолютные пути к отдельным файлам. Одним из вариантов является циклический просмотр запроса и добавление cfzipparam для каждого файла. Вот отдельный пример, вы можете адаптировать. (Он использует CFML, потому что это то, что в вашем примере, но, если вам удобно с синтаксисом скрипта, поищите версии на основе cfscript по ссылке выше).
Пример CFML:
<!--- For Demo only to simulate your database query --->
<cfset test = queryNew("Attachment"
, "varchar"
, [{Attachment="c:\path\to\fileA.png"}
, {Attachment="c:\path\to\fileB.png"}
, {Attachment="c:\path\to\fileC.png"}
])>
<cfzip action="zip" file="c:\path\to\TheNameYouWant.zip">
<cfloop query="test">
<!--- If Attachment only contains a file name (i.e. "someFileName.pdf")
use your variables to build a full path, i.e. "c:\path\to\someFileName.pdf"
--->
<cfzipparam source="#Attachment#">
</cfloop>
</cfzip>
Пример CFScript
<cfscript>
test = queryNew("Attachment"
, "varchar"
, [{Attachment="c:\path\to\fileA.png"}
, {Attachment="c:\path\to\fileB.png"}
, {Attachment="c:\path\to\fileC.png"}
]);
cfzip (action="zip", file="c:\path\to\TheNameYouWant.zip") {
for (row in test) {
cfzipparam (source=row.Attachment);
}
}
</cfscript>
Вкратце, вам не нужно публиковать реальные пути. В большинстве случаев это все равно не имеет значения;-) Однако, пожалуйста, публикуйте жестко закодированные значения, представляющие фактический путь, а не переменные. Причина в том, что переменные оставляют много открытых вопросов, на которые можно легко ответить, используя фиктивный путь, такой как c:\path\to\fileA.pdf
, В этом конкретном случае, знание таких вещей, как ваши o/s, будь то источники файлов / каталогов или относительные / абсолютные пути, поможет нам сразу исключить некоторые потенциальные проблемы.
<cfif test.recordcount>
<cfloop query="test">
<cfzip action="zip" file="#LocationOfwhereIwantTheEndResult#" source="#WhereTheFolderWithTheAttachmentsReside#">
</cfzip>
</cfloop>
</cfif>
Я подозреваю, что ваш file
а также source
места неверны. использование ExpandPath()
функция, чтобы убедиться, что он идет в правильное место.