2012-06-25 3 views
1

Я создаю приложение для нашего офиса, которое позволяет аутентифицированным пользователям в офисе загружать файлы для клиентов, создает список ссылок для загрузки файлов и электронной почты клиента со списком ссылки.Ловушка ошибок на ColdFusion 9 принудительная загрузка страницы

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

Иногда мне нужно очистить старые файлы и удалить каталоги, но когда это произойдет, есть шанс, что клиент может попытаться перезагрузить файл из старой ссылки.

В ColdFusion 9 как я поймаю это и отправлю их на страницу с ошибкой? Я также надеюсь использовать аналогичный код для перенаправления пользователя после начала загрузки, поэтому они не просто сидят на пустой странице во время процесса загрузки.

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

<cfset folder = #URL.folder#> 
<cfset FileDownload = #URL.file#> 

<cfset exten = ListLast(FileDownload, ".")> 

<cfswitch expression="#exten#"> 
<cfcase value="zip"><cfset content_type = "application/zip, application/x-zip, application/x-zip-compressed, application/octet-stream, application/x-compress, application/x-compressed, multipart/x-zip"></cfcase> 
<cfcase value="ai"><cfset content_type = "application/illustrator"></cfcase> 
<cfcase value="eps"><cfset content_type = "application/illustrator, application/octect-stream"></cfcase> 
<cfcase value="pdf"><cfset content_type = "application/pdf, application/x-pdf, application/acrobat, applications/vnd.pdf, text/pdf, text/x-pdf"></cfcase> 
<cfcase value="psd"><cfset content_type = "image/photoshop, image/x-photoshop, image/psd, application/photoshop"></cfcase> 
<cfcase value="jpg"><cfset content_type = "image/jpeg"></cfcase> 
<cfcase value="png"><cfset content_type = "image/png"></cfcase> 
<cfcase value="tif"><cfset content_type = "image/tiff"></cfcase> 
<cfdefaultcase><cfset content_type = "image/jpeg"></cfdefaultcase> 
</cfswitch> 

<cfset fileToGetSizeOf = expandPath("./#folder#/#FileDownload#") /> 


<cfoutput><cfheader name="content-disposition" value="attachment;filename=#FileDownload#"><cfheader name="content-length" value="#getFileInfo(fileToGetSizeOf).size#" /> 
<cfcontent type="#content_type#" file="#ExpandPath("./#folder#")#/#FileDownload#" deletefile="#delete_file#"></cfoutput> 

ответ

3

Есть три цели вы хотите достичь здесь:

  1. Подавать файлы надежно. В настоящее время вы не защищены от эксплуатации системы (или другого пользователя) файлов, например, как это (я установил переданные значения вместо ключей URL):

    <cfset folder = "../../../some/other/path/" /> 
    <cfset FileDownload = "some_other_file.pdf" /> 
    
  2. Показать 404 страницы, если файл или каталог не существует уже.

  3. Показывать некоторые интересные страницы после начала загрузки. Может быть, я что-то упустил, но перенаправление пользователя после начала загрузки (= отправленные заголовки) довольно сложно.

В любом случае, есть довольно простое и надежное решение ко всем этим.

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

  1. уникальный идентификатор.
  2. ID владельца файла.
  3. Название каталога.
  4. Имя файла.
  5. Описание (необязательно, вы можете использовать имя файла).
  6. Тип содержимого (необязательно, вы можете использовать подход с расширением).
  7. Дата создания (необязательно, может использоваться для плановой очистки).
  8. Скачивание счетчика (необязательно, если вы хотите ограничить количество скачиваний).
  9. Статус (необязательно, может использоваться для предотвращения проверки файловой системы для удаленных файлов).

Примечание: 3-4 может выполняться как отдельный столбец (путь/filename.ext), поскольку пути являются временными.

Итак, когда ваша заявка creates a list of links to download the files and emails the client with the list of links., она также записывает каждый файл в базу данных. Каждая из этих ссылок теперь может выглядеть следующим образом:

<a href="http://yourwebsite.tld/download.cfm?file=#ID#">#DESCRIPTION#</a> 

Когда пользователь щелкает скрипт ссылка выполняет следующие действия:

  1. Проверьте, если ID существует в БД. Если нет - перенаправление на страницу 404.
  2. Проверьте, совпадает ли текущий пользователь с идентификатором владельца. Если нет - перенаправление на страницу 404.
  3. Проверить статус файла, скачивать счетчик (если необходимо ограничить). Если нет - перенаправление на страницу 404.
  4. Проверить актуальность файла, используя существующий каталог и имя файла. Если нет - перенаправление на страницу 404.
  5. IF есть URL-адрес start: увеличивайте счетчик загрузок, используйте файл cfcontent и тип содержимого.
  6. ELSE визуализации HTML страницы, говоря «Загрузка начнется немедленно, нажмите на эту ссылку, если вы не хотите ждать», где ссылка выглядит download.cfm?file=#ID#&start=yes, плюс у вас есть meta http-equiv="refresh" с таким же URL.

Примечания:

  1. Шаги 1-4 могут быть обернуты в одном блоке Try/уловов с пользовательскими errorCode, так что вы можете иметь одно место перенаправления.
  2. Уловка с шагом 5 здесь заключается в том, что пользователь останется на странице при нажатии ссылки «Загрузка» и не увидит пустую страницу. Это не точное решение для цели № 3, но было бы трудно сделать что-то лучше без какой-либо обманчивости. Возможно, я ошибаюсь, и кто-то может предложить здесь лучший способ, было бы круто. Вы можете удалить «Нажмите эту ссылку», чтобы страница выглядела «естественной».
+0

Это прекрасный процесс. – Ofeargall

0

Если на вашем сайте 404 страницы, вы уже направляете их на страницу с ошибкой. Или, по крайней мере, ваш веб-сервер. Если у вас нет 404 страницы на сайте, сделайте это cfm-страницей, чтобы дать вам дополнительную функциональность (регистрация, оповещение и т. Д.)

0

Вы можете использовать FileExists для проверки наличия и принятия решения на основе на том, что:

<cfif NOT FileExists(fileToGetSizeOf)> 
    <!--- send a 404 ---> 
<cfelse> 
    <!--- send the file ---> 
</cfif> 
0

Вы можете использовать FileExists (absolute_path) функцию, чтобы проверить наличие загруженного файла.

Смежные вопросы