&引用;java.lang.OutOfMemoryError:java堆空间;在ColdFusion 11中使用ImageReadBase64()读取大图像时
我在ColdFusion 11中构建了一个简单的RESTAPI,它允许我们的供应商更新产品信息。它们发送的大多数数据(大约30个属性)都是简单的值——字符串和数字。一个属性是表示图像文件的Base64编码字符串。RESTAPI更新数据库中的简单数据值,然后读取图像并将其大小调整为适合在网站上使用的4个大小。我注意到,供应商偶尔会发送带有一些请求(20MB+)的大型图像,这些请求通常会在调用&引用;java.lang.OutOfMemoryError:java堆空间;在ColdFusion 11中使用ImageReadBase64()读取大图像时,java,image-processing,coldfusion,base64,coldfusion-11,Java,Image Processing,Coldfusion,Base64,Coldfusion 11,我在ColdFusion 11中构建了一个简单的RESTAPI,它允许我们的供应商更新产品信息。它们发送的大多数数据(大约30个属性)都是简单的值——字符串和数字。一个属性是表示图像文件的Base64编码字符串。RESTAPI更新数据库中的简单数据值,然后读取图像并将其大小调整为适合在网站上使用的4个大小。我注意到,供应商偶尔会发送带有一些请求(20MB+)的大型图像,这些请求通常会在调用ImageReadBase64()函数的行上产生“java.lang.OutOfMemoryError:ja
ImageReadBase64()
函数的行上产生“java.lang.OutOfMemoryError:java heap space”。我们在这台服务器上运行了其他web应用程序,似乎处理这些图像时被锁定的内存也会导致这些应用程序出现问题。我试图找出我在代码中是否可以做些什么来减少这些问题,即使它找到了一种方法,在图像“太大”(超过一定大小)时不处理它们。以下是为处理图像而运行的所有代码:
public struct function getDimensionsToEnlarge(
required numeric imageWidth,
required numeric imageHeight,
required numeric minWidth,
required numeric minHeight
) {
LOCAL.Dimensions={
width=-1,
height=-1
};
if ( ARGUMENTS.minHeight > 0
&& ARGUMENTS.minWidth > 0
&& ARGUMENTS.imageHeight < ARGUMENTS.minHeight
&& ARGUMENTS.imageWidth < ARGUMENTS.minWidth
) {
LOCAL.Dimensions.width=ARGUMENTS.minWidth;
LOCAL.Dimensions.height=ARGUMENTS.minHeight;
}
return LOCAL.Dimensions;
}
public struct function getDimensionsToShrink(
required numeric imageWidth,
required numeric imageHeight,
required numeric maxWidth,
required numeric maxHeight
) {
LOCAL.Dimensions={
width=-1,
height=-1
};
if ( ARGUMENTS.maxHeight > 0
&& ARGUMENTS.maxWidth > 0
&& ( ARGUMENTS.imageHeight > ARGUMENTS.maxHeight
|| ARGUMENTS.imageWidth > ARGUMENTS.maxWidth
)
) {
LOCAL.Dimensions.width=ARGUMENTS.maxWidth;
LOCAL.Dimensions.height=ARGUMENTS.maxHeight;
}
return LOCAL.Dimensions;
}
public struct function getDimensionsToFit(
required numeric imageWidth,
required numeric imageHeight,
required numeric minWidth,
required numeric minHeight,
required numeric maxWidth,
required numeric maxHeight
) {
LOCAL.Dimensions={
width=-1,
height=-1
};
LOCAL.Dimensions =
getDimensionsToEnlarge(
imageHeight=ARGUMENTS.imageHeight,
imageWidth=ARGUMENTS.imageWidth,
minWidth=ARGUMENTS.minWidth,
minHeight=ARGUMENTS.minHeight
);
if (LOCAL.Dimensions.width < 0 && LOCAL.Dimensions.height < 0)
LOCAL.Dimensions =
getDimensionsToShrink(
imageHeight=ARGUMENTS.imageHeight,
imageWidth=ARGUMENTS.imageWidth,
maxWidth=ARGUMENTS.maxWidth,
maxHeight=ARGUMENTS.maxHeight
);
return LOCAL.Dimensions;
}
public any function scale(
required any image,
string action="fit",
numeric minWidth=-1,
numeric minHeight=-1,
numeric maxWidth=-1,
numeric maxHeight=-1
) {
LOCAL.Dimensions={
width=-1,
height=-1
};
LOCAL.Image=Duplicate(ARGUMENTS.image);
switch (ARGUMENTS.action) {
case "shrink":
LOCAL.Dimensions =
getDimensionsToShrink(
imageHeight=LOCAL.Image.getHeight(),
imageWidth=LOCAL.Image.getWidth(),
maxWidth=ARGUMENTS.maxWidth,
maxHeight=ARGUMENTS.maxHeight
);
break;
case "enlarge":
LOCAL.Dimensions =
getDimensionsToEnlarge(
imageHeight=LOCAL.Image.getHeight(),
imageWidth=LOCAL.Image.getWidth(),
minWidth=ARGUMENTS.minWidth,
minHeight=ARGUMENTS.minHeight
);
break;
default:
LOCAL.Dimensions =
getDimensionsToFit(
imageHeight=LOCAL.Image.getHeight(),
imageWidth=LOCAL.Image.getWidth(),
minWidth=ARGUMENTS.minWidth,
minHeight=ARGUMENTS.minHeight,
maxWidth=ARGUMENTS.maxWidth,
maxHeight=ARGUMENTS.maxHeight
);
break;
}
if (LOCAL.Dimensions.width > 0 && LOCAL.Dimensions.height > 0) {
ImageSetAntialiasing(LOCAL.Image, "on");
ImageScaleToFit(
LOCAL.Image,
LOCAL.Dimensions.width,
LOCAL.Dimensions.height
);
}
return LOCAL.Image;
}
public void function createLargeThumbnail(required any image) {
ImageWrite(
scale(image=ARGUMENTS.image, maxHeight=500, maxWidth=700),
getLargeImagePath(),
0.75,
true
);
return;
}
public void function createMediumThumbnail(required any image) {
ImageWrite(
scale(image=ARGUMENTS.image, maxHeight=300, maxWidth=300),
getMediumImagePath(),
0.75,
true
);
return;
}
public void function createSmallThumbnail(required any image) {
ImageWrite(
scale(image=ARGUMENTS.image, maxHeight=50, maxWidth=50),
getSmallImagePath(),
0.75,
true
);
return;
}
public void function createMobileThumbnail(required any image) {
ImageWrite(
scale(image=ARGUMENTS.image, maxHeight=50, maxWidth=300),
getMobileImagePath(),
0.75,
true
);
return;
}
public void function createProductThumbnails(required any image) {
createLargeThumbnail(argumentCollection=ARGUMENTS);
createMediumThumbnail(argumentCollection=ARGUMENTS);
createSmallThumbnail(argumentCollection=ARGUMENTS);
createMobileThumbnail(argumentCollection=ARGUMENTS);
return;
}
createProductThumbnails(ImageReadBase64(ARGUMENTS.ImageUpload));
公共结构函数GetDimensionsTo放大(
所需的数字图像宽度,
所需的数字图像高度,
所需的数字最小宽度,
所需数字最小高度
) {
局部尺寸={
宽度=-1,
高度=-1
};
如果(ARGUMENTS.minHeight>0
&&ARGUMENTS.minWidth>0
&&ARGUMENTS.imageHeight0
&&ARGUMENTS.maxWidth>0
&&(ARGUMENTS.imageHeight>ARGUMENTS.maxHeight
||ARGUMENTS.imageWidth>ARGUMENTS.maxWidth
)
) {
LOCAL.Dimensions.width=ARGUMENTS.maxWidth;
LOCAL.Dimensions.height=ARGUMENTS.maxHeight;
}
返回局部尺寸;
}
公共结构函数getDimensionsToFit(
所需的数字图像宽度,
所需的数字图像高度,
所需的数字最小宽度,
所需数字最小高度,
所需的数字maxWidth,
所需的数字最大高度
) {
局部尺寸={
宽度=-1,
高度=-1
};
局部尺寸=
获取尺寸并放大(
imageHeight=ARGUMENTS.imageHeight,
imageWidth=ARGUMENTS.imageWidth,
minWidth=ARGUMENTS.minWidth,
minHeight=ARGUMENTS.minHeight
);
if(LOCAL.Dimensions.width<0和LOCAL.Dimensions.height<0)
局部尺寸=
getDimensionsToShrink(
imageHeight=ARGUMENTS.imageHeight,
imageWidth=ARGUMENTS.imageWidth,
maxWidth=ARGUMENTS.maxWidth,
maxHeight=ARGUMENTS.maxHeight
);
返回局部尺寸;
}
公共功能量表(
需要任何图像,
string action=“fit”,
数值minWidth=-1,
数字最小高度=-1,
数值maxWidth=-1,
数值maxHeight=-1
) {
局部尺寸={
宽度=-1,
高度=-1
};
LOCAL.Image=重复(ARGUMENTS.Image);
开关(ARGUMENTS.action){
案例“收缩”:
局部尺寸=
getDimensionsToShrink(
imageHeight=LOCAL.Image.getHeight(),
imageWidth=LOCAL.Image.getWidth(),
maxWidth=ARGUMENTS.maxWidth,
maxHeight=ARGUMENTS.maxHeight
);
打破
案例“放大”:
局部尺寸=
获取尺寸并放大(
imageHeight=LOCAL.Image.getHeight(),
imageWidth=LOCAL.Image.getWidth(),
minWidth=ARGUMENTS.minWidth,
minHeight=ARGUMENTS.minHeight
);
打破
违约:
局部尺寸=
getDimensionsToFit(
imageHeight=LOCAL.Image.getHeight(),
imageWidth=LOCAL.Image.getWidth(),
minWidth=ARGUMENTS.minWidth,
minHeight=ARGUMENTS.minHeight,
maxWidth=ARGUMENTS.maxWidth,
maxHeight=ARGUMENTS.maxHeight
);
打破
}
如果(LOCAL.Dimensions.width>0&&LOCAL.Dimensions.height>0){
ImageSet抗锯齿(LOCAL.Image,“on”);
图像比例拟合(
本地图像,
局部尺寸、宽度、,
局部尺寸高度
);
}
返回本地图像;
}
public void函数createLargeThumbnail(任何图像都需要){
图像写入(
比例(image=ARGUMENTS.image,maxHeight=500,maxWidth=700),
getLargeImagePath(),
0.75,
真的
);
返回;
}
公共无效函数createMediumThumbnail(任何图像都需要){
图像写入(
比例(image=ARGUMENTS.image,maxHeight=300,maxWidth=300),
getMediumImagePath(),
0.75,
真的
);
返回;
}
public void函数createSmallThumbnail(任何图像都需要){
图像写入(
比例(image=ARGUMENTS.image,maxHeight=50,maxWidth=50),
getSmallImagePath(),
0.75,
真的
);
返回;
}
public void函数createMobileThumbnail(任何图像都需要){
图像写入(
比例(image=ARGUMENTS.image,maxHeight=50,maxWidth=300),
getMobileImagePath(),
0.75,
真的
);
R