Struts2 Image的结果类型

时间:2014-01-10 07:38:03

标签: struts2 tags

在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;
}

1 个答案:

答案 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,之类的字符串并返回。