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.java: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.
<cfimage action="read" source="testimagefk9.jpg" name="myImage"/>
<cfset newImageName = "#createUUID()#.jpg"/>
<cfimage action="write" destination="#newImageName#" source="#myImage#"/>
O/S: XP SP2
CF: 8,0,0,176276
JVM: 1.6.0_01
[i]Tried reporting it to Adobe, but their bug report form throws a 404
(nice).[/i]
On submit? The form displays correctly for me.
http://www.adobe.com/cfusion/mmform/index.cfm?name=wishform
Works fine for me too (same config as per yours above).
--
Adam
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>
I tried upgrading to JVM 1.6.0_06 but still have the problem.
Interesting that imageIO works when you invoke it directly. The error being
generated comes from that class when using the cfimage tag:
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.java: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)
It seems to point to a bug in the implementation of CFImage.
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.
Also, report the bug to Adobe. The more reports the better.
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.
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
Thanks for mentioning the patch for the CF8 image resizing issue.
This error seems to be caused by <cfimage action="write" ..>. 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
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.
I'll try the image object thing it seems I don't have a choice.
Yes.
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?
<cfscript>
TestImg=ImageNew("#ProdTempPath & cffile.serverfile#");
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);
<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"?
Both ImageIO and bi are defined
Maybe the host's servers are messed up and need a reboot?
<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?
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.
Yes, that would do it ;-) Glad it is working now.
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
The info in the logs isn't enough to determine which CFImage bug you are
experiencing. Your best bet would be to wrap your CFImage logic in
cftry/cfcatch and email yourself a dump of the cfcatch structure. Quick and
dirty example below.
So far, the workaround is to call the underlying Java methods to manipulate
and write images. See above for cfSearching's example.
<cftry>
<cfimage...../>
<cfcatch type="any">
<cfmail...>
<cfdump var="#cfcatch#/>
</cfmail>
<cfrethrow/>
</cfcatch>
</cftry>
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&t
hreadid=1358449
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&threadid=13
56442&STARTPAGE=1&FTVAR_FORUMVIEWTMP=Linear)
The patch has been working for us. Maybe you are seeing a new bug. Wrap your
cfimage code try/catch (see my previous post), and trap the actual error. What
you are seeing in the logs is a generic error and won't tell you what the true
problem is.
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(JPEGImageWriter.java:
1208) at
com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java: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\Gallery\upload.c
fm:248) at
cfupload2ecfm1559718899._factor12(D:\Websites\LouisvilleMojoCom\Gallery\upload.c
fm: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.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.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilt
er.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:89) at
jrun.servlet.FilterChain.doFilter(FilterChain.java:86) at
coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilte
r.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 array
1 struct
COLUMN 0
ID CFIMAGE
LINE 248
RAW_TRACE at
cfupload2ecfm1559718899._factor11(D:\Websites\LouisvilleMojoCom\Gallery\upload.c
fm: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\Gallery\upload.c
fm: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
That looks like a new bug to me.
Just to keep this organized, start a new thread for this bug, post that dump
and give a link to the image causing the error (see my first post in this
thread for an example). Reply to this post with the new post URL and we'll all
try to replicate your error.
I haven't seen that error yet, so you may have discovered something new.