2012-05-15 2 views
1

У меня есть страница, где пользователь может обновить страницу с помощью 4 изображений и некоторых других полей. Уже есть изображение, загруженное для каждого ввода файла, и когда они загружают новый, я хочу взять новое изображение, загрузить его, а затем, если загрузка была удалена, удалите старое изображение. Однако я получаю эту ошибку.Проблема с coldfusion cffile delete

File /var/www/mywebsite.com/Pics/Sunset3.jpg specified in action delete does not exist. 

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

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

<cfquery name="getPreviousImage" datasource="#Application.datasourceName#"> 
     SELECT 
      image1, image2, image3, image4 
     FROM 
      #tableName# 
     WHERE 
      RecordID = '#form.ID#' 
</cfquery> 

<cfset oldImage1 = getPreviousImage.image1> 
<cfset oldImage2 = getPreviousImage.image2> 
<cfset oldImage3 = getPreviousImage.image3> 
<cfset oldImage4 = getPreviousImage.image4> 

<cfset image1 = getPreviousImage.image1> 
<cfset image2 = getPreviousImage.image2> 
<cfset image3 = getPreviousImage.image3> 
<cfset image4 = getPreviousImage.image4> 

<cfif #form.image1# NEQ ""> 

    <cffile action="upload" destination="#Application.filePath#Pics/" filefield="image1" nameconflict="makeunique"> 
    <cfif isDefined ("cffile.serverFile")> 
     <cfset image1Place = #cffile.serverFile#> 
    </cfif> 

    <cfif #getPreviousImage.image1# NEQ "" AND #image1Place# NEQ ""> 
     <cffile action="delete" file="#Application.filePath#Pics/#oldImage1#"> 
    </cfif> 
</cfif> 

<cfif #form.image2# NEQ ""> 

    <cffile action="upload" destination="#Application.filePath#Pics/" filefield="image2" nameconflict="makeunique"> 
    <cfif isDefined ("cffile.serverFile")> 
     <cfset image2Place = #cffile.serverFile#> 
    </cfif> 

    <cfif #getPreviousImage.image2# NEQ "" AND #image2Place# NEQ ""> 
     <cffile action="delete" file="#Application.filePath#Pics/#oldImage2#"> 
    </cfif> 
</cfif> 

<cfif #form.image3# NEQ ""> 

    <cffile action="upload" destination="#Application.filePath#Pics/" filefield="image3" nameconflict="makeunique"> 
    <cfif isDefined ("cffile.serverFile")> 
     <cfset image3Place = #cffile.serverFile#> 
    </cfif> 

    <cfif #getPreviousImage.image3# NEQ "" AND #image3Place# NEQ ""> 
     <cffile action="delete" file="#Application.filePath#Pics/#oldImage3#"> 
    </cfif> 
</cfif> 

<cfif #form.image4# NEQ ""> 

    <cffile action="upload" destination="#Application.filePath#Pics/" filefield="image4" nameconflict="makeunique"> 
    <cfif isDefined ("cffile.serverFile")> 
     <cfset image4Place = #cffile.serverFile#> 
    </cfif> 

    <cfif #getPreviousImage.image4# NEQ "" AND #image4Place# NEQ ""> 
     <cffile action="delete" file="#Application.filePath#Pics/#oldImage4#"> 
    </cfif> 
</cfif> 


<cfquery name="UpdateInfo" datasource="#Application.datasourceName#"> 
    UPDATE 
     #tableName# 
    SET     
     title = <cfqueryparam value="#form.title#" cfsqltype="CF_SQL_VARCHAR" maxlength="250">, 
     <cfif #image1Place# NEQ ""> 
      image1 = <cfqueryparam value="#image1Place#" cfsqltype="CF_SQL_VARCHAR" maxlength="250">, 
     </cfif> 
     <cfif #image2Place# NEQ ""> 
      image2 = <cfqueryparam value="#image2Place#" cfsqltype="CF_SQL_VARCHAR" maxlength="250">, 
     </cfif> 
     <cfif #image3Place# NEQ ""> 
      image3 = <cfqueryparam value="#image3Place#" cfsqltype="CF_SQL_VARCHAR" maxlength="250">, 
     </cfif> 
     <cfif #image4Place# NEQ ""> 
      image4 = <cfqueryparam value="#image4Place#" cfsqltype="CF_SQL_VARCHAR" maxlength="250">, 
     </cfif> 
     body = <cfqueryparam value="#form.body#" cfsqltype="CF_SQL_VARCHAR"> 
    WHERE RecordID = <cfqueryparam value="#form.ID#" cfsqltype="CF_SQL_INTEGER" maxlength="50"> 
</cfquery> 

EDIT: Это новая ошибка после того, как я реализовал FileExist(). Кроме того, я вижу, что все эти изображения растут на моем сервере. Я встречаюсь вокруг sunset10.jpg среди других фотографий. Если я получу этот файлExist для работы, не все, что он делает, это предотвратит отображение ошибки и удаление никогда не будет выполнено. Потому что эти файлы определенно существуют, если я не укажу на неправильное местоположение, конечно.

Invalid CFML construct found on line 107 at column 138. 
ColdFusion was looking at the following text: 

> 

The CFML compiler was processing: 

An expression beginning with #, on line 107, column 23.This message is usually caused  by a problem in the expressions structure. 
A cfif tag beginning on line 107, column 18. 
A cfif tag beginning on line 107, column 18. 
A cfif tag beginning on line 107, column 18. 

К сожалению, я не могу включить надежную отчетность об исключении. Кроме того, эта ошибка отображается при первом переходе на страницу. Прежде чем я получу шанс подать форму. Между тем этот код находится внутри if, который должен выполняться только после заполнения формы.

ответ

1

Вы можете добавить предложение fileExists() в ваш оператор IF перед попыткой удаления. Из вашего кода похоже, что вы предполагаете, что файл существует на основе того, что возвращается из БД, но не на основе фактического поиска в файловой системе.

Я также хотел бы убедиться, что вы не работаете в права доступа к файлам или проблемы обсадных (выглядит как вы на * NIX среды)

+0

Ahh, права на файлы, вероятно, моя проблема. Обычно я не использую coldfusion, поэтому ошибка, похоже, не описывает, поэтому я не думал об этом, но это также потому, что на сервере, как я полагаю, отключен надежный. Я также буду использовать fileexist на этой странице. Спасибо. –

+0

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

1

К сожалению, я не могу иметь окончательный ответ для вас. Похоже, ваш сервер может быть неправильно сконфигурирован, но я не могу сказать. Также возможно, что ваши файловые атрибуты (ok, «mode» на linux/unix) установлены неправильно, поэтому, возможно, CF не может его увидеть или удалить. Проверьте атрибут mode = "" на своих командах cffile.

Вот как решить проблему бросания исключений. Просто добавьте проверку для fileExists().

<cfif getPreviousImage.image1 NEQ "" AND image1Place NEQ "" AND fileExists(application.filePath & "Pics/" & oldImage1> 
    <cffile action="delete" file="#Application.filePath#Pics/#oldImage1#"> 
</cfif> 

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

Еще одно замечание - что-то жизненно важно - Ваш запрос:

SELECT 
     image1, image2, image3, image4 
    FROM 
     #tableName# 
    WHERE 
     RecordID = '#form.ID#' 

Вы действительно, действительно нужно положить # form.ID # в cfqueryparam. Ваша база данных может быть легко взломана.Вот то, что вам нужно:

WHERE 
     RecordID = <cfqueryparam value="#form.ID#" cfsqltype="cf_sql_integer" /> 

Кроме того, я надеюсь, #tableName# это не то, что происходит от пользовательского ввода. Это не охвачено областью, поэтому, если кто-то добавит &tablename=foo к URL-адресу, он может быть выбран вместо существующей переменной tableName. Я рекомендую вам указать область действия, возможно, как #variables.tableName#. Или еще лучше, не делайте динамические имена таблиц SQL (если вам действительно не нужно).

+0

Благодарим вас за ответ. Я переключил имя таблицы на статическое значение, это было условное понятие прошлого программиста, и он сказал, что сделал это таким образом для обеспечения безопасности, но не использовал coldfusion. Я предположил, что есть причина и сохранил его в этом коде. Я также попытался использовать файлExists(), как вы предложили, изменив некоторые из них, чтобы соответствовать, и я получаю новую ошибку. Когда я вынимаю файл, ошибка исчезает или по крайней мере перемещается в следующий экземпляр fileExist (для image2). Я отправлю сообщение об ошибке в моем исходном вопросе. Кроме того, мои разрешения кажутся правильными. Я говорил о своей настройке выше. –

+0

Я нашел его, Missing ")" для файла существует. Глупый мой lol. –

1

Я не думаю, что разрешения на доступ к файлам являются проблемой, как некоторые предложили. Ошибки разрешений будут упоминать о разрешениях. Поэтому я бы предположил, что ошибка говорит правду - что файл действительно «не существует». тщательно проверьте чувствительность к регистру (/ Pics vs./pics). Используйте FileExists как предложено (ваша вторая ошибка, скорее всего, ошибка синтаксиса.

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

у вас есть какие-то плохо используемые знаки фунта, а

<cfif #form.something# EQ ""> 

фунт знаки фактически релевантны для вывода не оценок. так что лучше

<cfif form.something EQ ""> 

Наконец - чтобы убедиться, что код может получить дескриптор файла он пытается удалить можно рассмотреть названные замки, как так:

<cfif trim(form.image4) IS NOT ""> 

    <cflock name="piclock_img4" timeout="25"> 
    <cffile action="upload" destination="#Application.filePath#Pics/" filefield="image4" nameconflict="makeunique"> 
    <cfif structkeyexists(cffile,"serverfile")> 
     <cfset image4Place = cffile.serverFile> 
    </cfif> 
    </cflock> 

    <cflock name="piclock_img4" timeout="10"> 
    <cfif trim(getPreviousImage.image4) IS NOT "" AND trim(image4Place) IS NOT ""> 
     <cffile action="delete" file="#Application.filePath#Pics/#oldImage4#"> 
    </cfif> 
    </cflock> 
</cfif> 

Если это не работает, вы можете попробовать добавить сон (2000) в между ними - дать ОС время выпуска дескриптора файла. В наши дни с таким большим количеством различных типов хранилищ трудно понять лежащий в основе механизм ввода-вывода и то, как он перетекает в ОС и ваш код.

Надеюсь, это поможет.

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