2012-08-24 2 views
0

Я делаю сайт в coldfusion8/mysql 5.0.88 с передним концом в JQuery Mobile. Я также использую плагин photoswipe.js, который позволяет масштабировать изображения и просматривать их в отдельном слое.Предотвращение утечки памяти при использовании cfimage и cfxml?

Для установки photoswipeable изображений, мне нужно вывести

<cfoutput> 
<a class="swipeMe" rel="external" href="#variables.imageSrc#"> 
    <img src="#variables.imageSrc#" class="adaptImg ui-li-thumb" /> 
</a> 
</cfoutput> 

Проблема imageSrc поставляются пользователями, так что я должен взять/Validate/изменить размер изображения перед выводом его и мне нужна стезя изображение для фотографии.

я возился с этим на некоторое время и придумал следующее решение:

// read img from user specs 
<cfimage name="myImage" source="#bildpfad##bilddateiname#" action="read" /> 
<cfif IsImage(myImage) is true> 
     // resize 
     <cfscript> 
      ImageSetAntialiasing(myImage,"on"); 
      variables.breite = 400; 
      ImageScaleToFit(myImage, variables.breite,"", "highestPerformance"); 
     </cfscript> 
     // write to xml, so I can get the path 
     <cfxml variable="imageXml"> 
      <cfimage quality=".5" action="writetobrowser" source="#myImage#" class="adaptImg ui-li-thumb"/ 
     </cfxml> 
     <cfset variables.imageSrc = imageXml.xmlRoot.xmlAttributes.src> 
     // output 
     <cfoutput> 
     <a class="swipeMe" rel="external" href="#variables.imageSrc#">#imageXml#</a> 
     </cfoutput> 
</cfif> 

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

Вопрос:
Есть ли очевидная проблема с выше код вызывает утечку памяти? Я воображаю, что изображения записываются в какой-то временный каталог (CFFileservelet?) И остаются там, блокируя мою память. Если да, то какими будут альтернативные подходы к обработке этого при поиске изображений?

Спасибо!

+0

Я не знаю, это относится к i, но атрибут класса не указан как допустимый атрибут в CFML do cs для тега CFIMAGE. Работает ли этот код, но висит? или просто повесить? – Dpolehonski

+0

он работает. Я также устанавливаю 'id' и' title' и собственный атрибут 'data-xyz' помимо класса. Я где-то читал, что вы можете добавлять атрибуты в cfimage allright. Позвольте мне посмотреть, найду ли я ссылку. GOt it [здесь] (http://www.bennadel.com/blog/846-Styling-The-ColdFusion-8-WriteToBrowser-CFImage-Output.htm) – frequent

ответ

2

Почему бы не просто создать папку/TMP на вашем сервере, и писать манипулируют изображения там, как:

<cfset newImageName=CreateUUID()&".jpg"> 
<cfimage action="write" destination="/tmp/#newImageName#" source="#myImage#"> 

Затем вы можете использовать:

<cfoutput> 
    <a class="swipeMe" rel="external" href="/tmp/#newImageName#"><img src="/tmp/#newImageName#" class="..."></a> 
    </cfoutput> 

Sample запланированное задание, чтобы удалить Временные файлы:

<cfdirectory action="LIST" directory="#expandpath('tmp/')#" name="tempfiles" filter="*.jpg"> 
<cfloop query="tempfiles"> 
    <cfif dateadd('h',24,dateLastModified) lt now()> 
     <cffile action="DELETE" file="#expandpath('tmp/')##name#"> 
    </cfif> 
</cfloop> 
+0

Это также будет вариант. Мне понравилось мое решение, потому что оно удалило изображения через какое-то время. Есть ли способ сделать это: очистка сохраненных изображений или установка правильности при их сохранении или мне нужно вручную очистить? – frequent

+0

Вы можете создать метку времени для изображений в имени или метаданных. И во главе страницы выполните CFTHREAD, который будет очищать любые изображения старше определенного времени. Используя CFthread, вы не будете ждать завершения задачи. Огонь и забыть. – Dpolehonski

+0

Я бы сделал, как предложил Dpole, и использовал созданное datetime файла для очистки изображений старше X-времени. Таким образом, вы можете построить некоторую логику файлов, то есть если (image_resized не существует) rezie else использует изображение, поэтому вам нужно только его изменить один раз за цикл очистки. – Paul