1

I'm running Coldfuison8 and have trouble with an image file upload, where I seem to often end up with users trying to upload CMYK JPEG files.

While the upload works fine (I don't get any errors) and isImageFile also returns yes, the colors of the loaded image are distorted.

Only doing this already saves the wrong colored image to the server:

<cffile result="temp" 
        action="upload" 
        accept="image/jpeg,image/jpg" 
        filefield="Dateiname8" 
        destination="#variables.tempDirectory#" 
        nameconflict="overwrite" />

Question:
If isImageFile does not produce an error, Coldfusion correctly identifies the image. What do I need to do to display it correctly?

EDIT1:
By distorted I mean, the file looks like this:

enter image description here

and ends up like this:

enter image description here

EDIT2:

<cfhttp timeout="45" 
    throwonerror="no" 
    url="#LOCAL.testFilePath#" 
    method="get" 
    useragent="Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12"
    getasbinary="yes" 
    result="LOCAL.objGet">
<cfset LOCAL.objImage = ImageNew(LOCAL.objGet.FileContent)>
<cfset LOCAL.ext = ".png">
<cfset LOCAL.basePath = LOCAL.tempDirectory & "_base_" & LOCAL.file & LOCAL.ext>
<cfset imageWrite( LOCAL.objImage, LOCAL.basePath, ".99")>

So, I'm splitting the filename into file and ext and then replace the extension with .png. The file gets created, but has 0 file size with the error thrown.

Any idea what might be causing this?

EDIT3:
Here is my script using imageMagick:

<cffile result="temp" action="upload" accept="image/jpeg,image/jpg" filefield="Dateiname8" destination="#variables.tempDirectory#" nameconflict="overwrite" />
<cfset variables.testFilePath = variables.tempDirectory & temp.serverFile>
<!--- imageMagick for CMYK uploads --->
<cftry>
    <cfimage action="info" source="#variables.testFilePath#" structname="cmyk" />
        <cfcatch type="any">
            <cftry>
                <cfexecute name="#expandpath("../tools/imageMagick/convert.exe")#" arguments="#variables.testFilePath# -strip -colorspace rgb -quality 100 #variables.testFilePath#" timeout="30" variable="msg" />
                <cfcatch>
                    <cfdump output="dump.txt" label="catch" var="type: #cfcatch.type#">
                    <cfdump output="dump.txt" label="catch" var="message: #cfcatch.message#">
                    <cfdump output="dump.txt" label="catch" var="detail: #cfcatch.detail#">
               </cfcatch>
            </cftry>
        </cfcatch>
    </cftry>
    <!--- Image can now be read --->
    <cfimage action="info" source="#variables.testFilePath#" structname="cmyk" />

ImageMagick ran fine, but the image was still tainted. I then tried this:

<cfset variables.testFilePath = variables.tempDirectory & temp.serverFile>
<cfset variables.try = ImageRead( variables.testFilePath )>
<cfset ImageNegative( variables.try )>
<cfset ImageWrite( variables.try, variables.testFilePath, "0.99")>  

And it created the correct image. Only problem is how to check for CMYK on the original image. Then I wouldn't need to use ImageMagick.

EDIT4:
And this is the full error I'm getting when trying to save the image as a png

Detail: Ensure that the file is a vaild image file.
Message: ColdFusion was unable to create an image from the specified source file.
StackTrace: coldfusion.image.ImageReader$UnableToCreateImageException: ColdFusion was unable to create an image from the specified source file.
at coldfusion.image.ImageReader.readImage(ImageReader.java:114)
at coldfusion.image.Image.<init>(Image.java:236)
at coldfusion.runtime.CFPage.ImageRead(CFPage.java:5841)
at cfform_img_handler2ecfc1184626149$funcUPLOAD.runFunction(E:123)
at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:418)
at coldfusion.filter.SilentFilter.invoke(SilentFilter.java:47)
at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:324)
at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:59)
at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:277)
at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:463)
at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:453)
at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:320)
at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2222)
at coldfusion.tagext.lang.InvokeTag.doEndTag(InvokeTag.java:358)
at cfhs_herstellerprofil2ecfm1153584487._factor19(E:559)
at cfhs_herstellerprofil2ecfm1153584487._factor21(E:514)
at cfhs_herstellerprofil2ecfm1153584487._factor22(E:511)
at cfhs_herstellerprofil2ecfm1153584487._factor41(E:502)
at cfhs_herstellerprofil2ecfm1153584487.runPage(E:1)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:483)
at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:282)
at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)
at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:74)
at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
at coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:126)
at coldfusion.CfmServlet.service(CfmServlet.java:198)
at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
at jrun.servlet.FilterChain.service(FilterChain.java:101)
at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)
at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
TagContext:  ...    
Type: Application

[object of coldfusion.image.ImageReader$UnableToCreateImageException] Class Name: coldfusion.image.ImageReader$UnableToCreateImageException

Parent Class: [object of coldfusion.image.ImageException] Class Name: coldfusion.image.ImageException

Parent Class: [object of coldfusion.runtime.ApplicationException]
    Class Name: coldfusion.runtime.ApplicationException
    Parent Class: [object of coldfusion.runtime.NeoException]
        Class Name: coldfusion.runtime.NeoException
        Methods:  
            findAdvancedCFTarget(coldfusion.runtime.AdvancedCFException, java.lang.String[]) returns int 
            findCustomTarget(coldfusion.runtime.CustomException, java.lang.String[]) returns int 
            findThrowableTarget(java.lang.Throwable, java.lang.String[]) returns int 
            getDetail() returns java.lang.String 
            getLocalizedMessage() returns java.lang.String 
            getMessage() returns java.lang.String 
            getRootCause() returns java.lang.Throwable 
            getString(java.lang.Throwable, java.lang.String, java.util.Locale) returns java.lang.String 
            getType() returns java.lang.String 
            setLocale(java.util.Locale) returns void 
            unwrap(java.lang.Throwable) returns java.lang.Throwable
        Parent Class: [object of java.lang.RuntimeException]
            Class Name: java.lang.RuntimeException
            Parent Class: [object of java.lang.Exception]
                Class Name: java.lang.Exception
                Parent Class: [object of java.lang.Throwable]
                    Class Name: java.lang.Throwable
                    Methods:  
                        fillInStackTrace() returns java.lang.Throwable 
                        getCause() returns java.lang.Throwable 
                        getLocalizedMessage() returns java.lang.String 
                        getMessage() returns java.lang.String 
                        getStackTrace() returns java.lang.StackTraceElement[] 
                        initCause(java.lang.Throwable) returns java.lang.Throwable 
                        printStackTrace(java.io.PrintWriter) returns void 
                        printStackTrace(java.io.PrintStream) returns void 
                        printStackTrace() returns void 
                        setStackTrace(java.lang.StackTraceElement[]) returns void 
                        toString() returns java.lang.String 
4

0 回答 0