在Struts2应用程序中,我尝试使用我的Custome结果类型。但是我没有得到任何影响,我的基于JSP页面图像的动作没有被调用。并且没有异常。我请纠正我在哪里做错了。 HTTPFox说404,但在JAVA控制台中没有得到任何东西。
HTML:
<img src=" <s:url action='ExternalImageAction' />" />
XML:
<package name="externalImage_package" extends="struts-default">
<result-types>
<result-type name="myBytesResult" class="leo.struts.CustomeImageResult" />
</result-types>
<action name="ExternalImageAction" class="leo.struts.ExternalImageAction">
<result name="myImageResult" type="myBytesResult">
</result>
</action>
</package>
HTTPFOX:
00:18:06.762 0.044 432 1258 GET 404 text/html (NS_ERROR_FAILURE) http://localhost:8888/Struts2Whole/%3Cs:url%20action=%27ExternalImageAction%27%20/%3E
CustomeImageResult:
public void execute(ActionInvocation invocation)抛出异常{
ExternalImageAction action = (ExternalImageAction) invocation.getAction();
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType(action.getContentType());
response.getOutputStream().write(action.getImageInBytes());
response.getOutputStream().flush();
}
ExternalImageAction:
public String execute()
{
System.out.println("execute of the ExternalImageAction...........");
setContentType("jpg");
setImageInBytes(getFileBytes("C:/Users/Joseph.M/Desktop/ocwcd5.jpg"));
return "myImageResult";
}
public static byte[] getFileBytes(String filePath)
{
File file = new File(filePath);
System.out.println("file : "+file.getName());
byte[] b = new byte[(int) file.length()];
try {
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(b);
for (int i = 0; i < b.length; i++) {
System.out.print((char)b[i]);
}
fileInputStream.close();
} catch (FileNotFoundException e) {
System.out.println("File Not Found.");
e.printStackTrace();
}
catch (IOException e1) {
System.out.println("Error Reading The File.");
e1.printStackTrace();
}
System.out.println("byes of image size : "+b.length);
return b;
}
答案 0 :(得分:2)
如果您向src
标记的<img />
属性返回内容,则认为该网址是网址,请尝试将其打开并接收404 Not Found
。
由于您没有返回URL,而是返回字节数组中的实际图像,因此您需要使用Data URI scheme中定义的RFC 2397。
假设您的结果只返回字节,您应该将数据URI放在html中,如下所述:https://stackoverflow.com/a/20019398/1654265
否则,您可以在struts结果本身中返回完整的数据URI(必须包含Mime类型),并保持当前JSP不变。
只需使用Apache Commons的byte[]
将encodeBase64URLSafeString
转换为Base64字符串,将其附加到data:image/jpeg;base64,
之类的字符串并返回。