Skip navigation
Currently Being Moderated

Another CFImage bug

Apr 17, 2008 12:17 PM

Second cfImage bug I've found in a week. Tried reporting it to Adobe, but their bug report form throws a 404 (nice).

Basically, certain JPGs will cause CF (or more specifically, Java) to throw this error after reading them to memory, then writing it to disk:
Missing Huffman code table entry
javax.imageio.IIOException: Missing Huffman code table entry at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeImage(Native Method) at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.ja va:996) at coldfusion.image.ImageWriter.writeJPeg(ImageWriter.java:60) at coldfusion.image.ImageWriter.writeImage(ImageWriter.java:119) at coldfusion.image.Image.write(Image.java:578) at coldfusion.tagext.io.ImageTag.performWrite(ImageTag.java:593) at coldfusion.tagext.io.ImageTag.doStartTag(ImageTag.java:500)

Run the attached code with the image found here:
http://img141.imageshack.us/img141/9549/testimagefk9.jpg

If you put the URL into the cfimage source (instead of downloading the image and reading it locally) you get a different error:
coldfusion.image.Image$ReadImageMetadataException: Exception occured in JPG processing.
segment size would extend beyond file stream length
at coldfusion.image.Image.initializeMetadata(Image.java:2403)
at coldfusion.image.Image.getExifMetadata(Image.java:2415)
at coldfusion.image.Image.write(Image.java:577)
at coldfusion.tagext.io.ImageTag.performWrite(ImageTag.java:593)
at coldfusion.tagext.io.ImageTag.doStartTag(ImageTag.java:500)

Verified on Win2K, Win2K3, and WinXP. CF version 8.0.1.
 
Replies
  • Currently Being Moderated
    Apr 19, 2008 1:16 PM   in reply to hans blix
    Did you encounter this problem with 8.0.0? What JVM version are you using? I tested the code using both the url and a local file and both work without error under:

    O/S: XP SP2
    CF: 8,0,0,176276
    JVM: 1.6.0_01

    Tried reporting it to Adobe, but their bug report form throws a 404 (nice).
    On submit? The form displays correctly for me.
    http://www.adobe.com/cfusion/mmform/index.cfm?name=wishform
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 19, 2008 2:09 PM   in reply to hans blix
    > Did you encounter this problem with 8.0.0? What JVM version are you using? I
    > tested the code using both the url and a local file and both work without error
    > under:
    >
    > O/S: XP SP2
    > CF: 8,0,0,176276
    > JVM: 1.6.0_01

    Works fine for me too (same config as per yours above).

    --
    Adam
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 20, 2008 4:43 PM   in reply to -==cfSearching==-
    After applying updater 1, I received the two errors you posted above.

    O/S: XP SP2
    CF: 8,0,1,195765
    JVM: 1.6.0_04

    Reverting to JVM 1.6.0_01-b06 had no effect on the error. I rolled back to CF 8.0.0 and the errors went away. That does seem to support the theory it is not or not solely a jvm problem. Out of curiosity, is there anything special about these images or do they all have something in common?

    Using ImageIO to write the images, instead of cfimage, seems to work with 8.0.1.

    <cfscript>
    newImageName = createUUID() & ".jpg";
    outFile = createObject("java", "java.io.File").init( ExpandPath(newImageName) );
    bi = ImageGetBufferedImage(myImage);
    ImageIO = createObject("java", "javax.imageio.ImageIO");
    ImageIO.write( bi, "jpeg", outFile );
    </cfscript>

     
    |
    Mark as:
  • Currently Being Moderated
    Apr 23, 2008 12:01 AM   in reply to -==cfSearching==-
    Now that I have worked around the image lock issue I am running into this issue now as well.

    Is there anyway to fix it and perform a resize.

    Our customer is in a shared hosted environment and as a result we cannot change any CF settings to override how CFImage works.
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 23, 2008 6:40 PM   in reply to hans blix
    @hans blix,

    Yes I did notice the error is from the same package. However, the calling method is from com.sun.imageio.plugins. While I do not know about the internals of either class, since one works for me and the other does not I can only assume cfimage's method of writing out images is different than ImageIO.write.

    My guess is the resize/write problem mentioned your other thread is a bug. This exception may be a bug as well. However, I am not familiar with image compression and decoding. So it may still be a problem with the image files themselves. Though I suspect not.

    @DefconRhall,

    Try the code snippet above. It should work with 8.0.1. You could use it to replace the cfimage call, or call it if a: "javax.imageio.IIOException: Missing Huffman code table entry" exception is thrown.
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 23, 2008 10:36 PM   in reply to -==cfSearching==-
    I always like to try and understand code a bit before I implement it..

    If I understand that snipet of code I basically want to use it to load up the file I just uploaded, have it save the image on top of itself, and then run the cfimage to do the resize?

    Thanks,

    PS: Looks like the locking bug with CFImage has been addressed by Adobe
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 24, 2008 5:35 AM   in reply to DefconRhall
    @DefconRhall,

    Thanks for mentioning the patch for the CF8 image resizing issue.

    This error seems to be caused by <cfimage action="write" ..>. [ Update: More accurately the error occurs when you try and write the image to disk ]. So the code snippet above would only replace the write action. You would first resize your image as usual, then use the snippet above to save the resized image to disk.

    <cfscript>
    newImageName = createUUID() & ".jpg";
    // create a file object representing the path to the saved image
    outFile = createObject("java", "java.io.File").init( ExpandPath(newImageName) );

    // extract the underlying BufferedImage from your CF image object
    bi = ImageGetBufferedImage(myImage);

    ImageIO = createObject("java", "javax.imageio.ImageIO");
    // use ImageIO (instead of cfimage) to physically save the image to disk
    ImageIO.write( bi, "jpeg", outFile );
    </cfscript>
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 27, 2008 6:41 PM   in reply to hans blix
    What is odd is it seems to work perfectly fine when I resize the image to like 100x100, however the next line afterwards I resize to like 640x480 and it bombs...

    I'll try re-reading the image file before doing the second resize and post the result.

    Also by image object I take it you mean the return variable from the cfimage tag.
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 27, 2008 6:57 PM   in reply to DefconRhall
    Well... that just made me look like an idiot, it failed this time on the first try...

    I'll try the image object thing it seems I don't have a choice.
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 27, 2008 7:01 PM   in reply to DefconRhall
    DefconRhall wrote:
    Also by image object I take it you mean the return variable from the cfimage tag.

    Yes.
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 27, 2008 7:41 PM   in reply to -==cfSearching==-
    Not sure why this doesn't work, so I'll post it here.

    It gives me " The system has attempted to use an undefined value, which usually indicates a programming error, either in your code or some system code."

    In reference to the line: "ImageIO.write( bi, "jpeg", outFile );"

    The bi is defined and so is outfile so what the heck doesn't it like?
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 27, 2008 7:58 PM   in reply to DefconRhall
    It works perfectly for me.

    <cfscript>
    // sample values for test script
    ThumbWidth = 50;
    ThumbHeight = 50;
    GetProduct.ThumbNailPhysPath = "SavedFile.jpg";
    TestImg=ImageNew(ExpandPath("MyTestImage.jpg"));

    ImageResize(TestImg,ThumbWidth,ThumbHeight);
    outFile = createObject("java", "java.io.File").init( ExpandPath(GetProduct.ThumbNailPhysPath) );

    // extract the underlying BufferedImage from your CF image object
    bi = ImageGetBufferedImage(TestImg);

    ImageIO = createObject("java", "javax.imageio.ImageIO");
    // use ImageIO (instead of cfimage) to physically save the image to disk
    ImageIO.write( bi, "jpeg", outFile );
    </cfscript>

    Dumb question, but are you sure the error is really on that line? If you comment it out does the code work? Also I assume you did an IsDefined on both variables: "bi" and "outFile"?
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 27, 2008 8:05 PM   in reply to hans blix
    Yep, if I drop that line it works fine.

    Both ImageIO and bi are defined

    Maybe the host's servers are messed up and need a reboot?
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 27, 2008 8:16 PM   in reply to DefconRhall
    Both ImageIO and bi are defined
    What about "outFile"? Also what results do you get if you run this code before the ImageIO.write?

    <cfdump var="#bi.getClass().getName()#" label="Variable bi class name"><br>
    <cfdump var="#outFile.getClass().getName()#" label="Variable outFile class name"><br>
    <cfdump var="#bi.getWidth()#x#bi.getHeight()#" label="BufferedImage width x height"><br>
    <cfdump var="#outFile.getAbsolutePath()#" label="OutFile Path">

    Without seeing the full error, my guess would be the same as yours: one of the two variables is not defined for some reason. Can you post the full error message and stack trace?
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 27, 2008 8:44 PM   in reply to hans blix
    AH HA!

    It caught me! With crazy file pathing...

    The expandpath was adding the current directory to my full qualified path, thus resulting in "bad mojo".

    Chalk this up to me forgetting about the ExpandPath in your example.
     
    |
    Mark as:
  • Currently Being Moderated
    Apr 27, 2008 8:58 PM   in reply to DefconRhall
    DefconRhall wrote:
    The expandpath was adding the current directory to my full qualified path, thus resulting in "bad mojo".

    Yes, that would do it ;-) Glad it is working now.
     
    |
    Mark as:
  • Currently Being Moderated
    May 5, 2008 2:05 PM   in reply to hans blix
    We upgraded to 8.01 today (Windows 2003 server) and immediately started seeing problems with the CFIMAGE routines. The hotfix hasn't worked for us, though it seems to have made the frequency slightly less.

    Our application log shows a few of these every few minutes:

    An exception occured while trying to write the image. Ensure that the destination directory exists and that Coldfusion has permission to write to the given path or file. cause : coldfusion.image.ImageWriter$ImageWritingException: An exception occured while trying to write the image.

    Is work on this hotfix ongoing? Can we expect to see an update sometime soon?

    Or.... my favorite and more typical situation, am I the only one still having this issue? :-)

    Many thanks,
    - Piper
     
    |
    Mark as:
  • Currently Being Moderated
    May 6, 2008 4:19 AM   in reply to hans blix
    Update: According to Kiran Sakhare a hotfix for the locking and Huffman table issues will be released soon. I do not know if it will also fix the "Quantization table 0x02 was not defined" error.

    In the mean time, the full method I am using as a work-around is:
    http://www.adobe.com/cfusion/webforums/forum/messageview.cfm?forumid=1 &catid=7&threadid=1358449
     
    |
    Mark as:
  • Currently Being Moderated
    May 7, 2008 1:04 PM   in reply to hans blix
    Updated hot fix was published today. Visit http://www.adobe.com/go/kb402604 for list of all CF8/8.01 hot fixes. Again, the CFImage hot fix was updated today (5/7/08).
     
    |
    Mark as:
  • Currently Being Moderated
    May 15, 2008 7:51 AM   in reply to hans blix
    Hey Guys,
    We tried the latest/greatest CFImage hotfix (updated) yesterday but we started finding the same errors again in the application.log:

    An exception occured while trying to write the image. Ensure that the destination directory exists and that Coldfusion has permission to write to the given path or file. cause : coldfusion.image.ImageWriter$ImageWritingException: An exception occured while trying to write the image.

    We're still successfully using the java code workaround, but it is noticeably slower than the CFImage writing function, so we had to increase timeouts on the upload pages to deal with that.

    Is anyone else still experiencing this issue?

    Best,
    - Piper

    (This is a cross-post from: http://www.adobe.com/cfusion/webforums/forum/messageview.cfm?catid=3&t hreadid=1356442&STARTPAGE=1&FTVAR_FORUMVIEWTMP=Linear)
     
    |
    Mark as:
  • Currently Being Moderated
    May 19, 2008 1:15 PM   in reply to hans blix

    Hello, I work with Piper. We've wrapped the CFIMAGE Write tags in catch / try blocks as suggested. I'm attaching the resulting HTML (from cfdump var="#cfcatch#") . Any thoughts? Is there anyway to paste RAW html in the forums? If not, can you point me in the direction of what to look for in this CFDUMP output? I'll paste some of what seems to be the more pertinent information below.

    Thanks in advance for any and all help!
    Rob

    Message: Metadata components != number of destination bands
    StackTrace: javax.imageio.IIOException: Metadata components != number of destination bands at com.sun.imageio.plugins.jpeg.JPEGImageWriter.checkSOFBands(JPEGImageW riter.java:1208) at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.ja va:656) at coldfusion.image.ImageWriter.writeJPeg(ImageWriter.java:70) at coldfusion.image.ImageWriter.writeImage(ImageWriter.java:102) at coldfusion.image.Image.write(Image.java:615) at coldfusion.tagext.io.ImageTag.performWrite(ImageTag.java:593) at coldfusion.tagext.io.ImageTag.doStartTag(ImageTag.java:500) at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2661) at cfupload2ecfm1559718899._factor11(D:\Websites\LouisvilleMojoCom\Galle ry\upload.cfm:248) at cfupload2ecfm1559718899._factor12(D:\Websites\LouisvilleMojoCom\Galle ry\upload.cfm:1) at cfupload2ecfm1559718899.runPage(D:\Websites\LouisvilleMojoCom\Gallery \upload.cfm:1) at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:196) at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:370) at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65) at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:279 ) at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.ja va: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.ClientScopePersistenceFilter.invoke(ClientScopePers istenceFilter.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:175) at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:8 9) at jrun.servlet.FilterChain.doFilter(FilterChain.java:86) at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringS ervletFilter.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.ja va:203) at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPoo l.java:320) at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.j ava:428) at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool. java:266) at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)


    TagContext array
    1 struct
    COLUMN 0
    ID CFIMAGE
    LINE 248
    RAW_TRACE at cfupload2ecfm1559718899._factor11(D:\Websites\LouisvilleMojoCom\Galle ry\upload.cfm:248)
    TEMPLATE D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm
    TYPE CFML

    2 struct
    COLUMN 0
    ID CF_UPLOAD
    LINE 1
    RAW_TRACE at cfupload2ecfm1559718899._factor12(D:\Websites\LouisvilleMojoCom\Galle ry\upload.cfm:1)
    TEMPLATE D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm
    TYPE CFML

    3 struct
    COLUMN 0
    ID CF_UPLOAD
    LINE 1
    RAW_TRACE at cfupload2ecfm1559718899.runPage(D:\Websites\LouisvilleMojoCom\Gallery \upload.cfm:1)
    TEMPLATE D:\Websites\LouisvilleMojoCom\Gallery\upload.cfm
    TYPE CFML
     
    |
    Mark as:

More Like This

  • Retrieving data ...

Bookmarked By (0)

Answers + Points = Status

  • 10 points awarded for Correct Answers
  • 5 points awarded for Helpful Answers
  • 10,000+ points
  • 1,001-10,000 points
  • 501-1,000 points
  • 5-500 points