【问题标题】:Retrieve Image From ASHX URL Using Java (In PeopleSoft PeopleCode)使用 Java 从 ASHX URL 检索图像(在 PeopleSoft PeopleCode 中)
【发布时间】:2013-09-20 16:34:09
【问题描述】:

我需要从遵循http://domain.com/handler.ashx?id=013505 形式的 .NET ASHX 处理程序重复提取图像,其中 ID 标识处理程序应为其提供图像的人。我必须在 PeopleSoft 应用程序中执行此操作,因此我仅限于大部分在 PeopleCode 中提供的内容,但也可以使用大量 Java(尽管从语法上讲,这对纯 Java 开发人员)。到目前为止我能做的事情

  • 使用 URL 类和 URLConnection 类的 openConnection 方法打开到 URL 的连接,最终以 InputStream 对象结束。
  • 然后我尝试使用 ImageIO 类通过 read 方法检索 BufferedImage 对象并传入上述 InputStream 对象
  • 此时,BufferedImage 对象始终返回“null”。返回的似乎不是图像,而只是 HTML 的简短介绍。
  • 如果我使用指向 URL 的直接路径(无查询字符串,例如 http://domain.com/image.jpg),我的方法就可以正常工作,并且我可以使用返回的 BufferedImage 对象。
  • 我已尝试使用 setRequestProperty 方法在 URLConnection 上显式设置 User-Agent 字符串,正如此处的另一篇文章所建议的那样,但无济于事。

如果有人觉得我正在使用的代码有帮助,我会很乐意发布它,但正如我所说,这是对这些 Java 类的“PeopleCode 化”使用,因此它可能对许多人没有意义。我真的只是在寻找一些关于 Java 中可能出现的问题的一般性建议;我可以从那里翻译它以在 PeopleCode 中尝试。

【问题讨论】:

    标签: java image ashx


    【解决方案1】:

    只是为了繁荣,因为这将在“互联网”上永久存在,这是我问题的最终解决方案:

    首先,我返回我引用的“HTML 模糊”的原因是因为我指向的 URL 正在重定向到另一个服务器。

    一旦我弄清楚并指向“真实”服务器,我就开始收到 SSL 证书信任错误。在这种情况下,服务器有一个内部自签名证书。我尝试在我的 PeopleSoft Web 服务器和 PeopleSoft 的数字证书库中简单地安装该证书,但无济于事。然后我转向了 B 计划:强制我的 PeopleCode/Java 混合使用证书本身。

    在大多数情况下,this post 帮助我弄清楚我需要做什么。总的来说,这些是我采取的步骤:

    • 根据 PEM 格式的证书字符串创建 CertificateFactory
    • 从证书工厂获取证书对象(generateCertificate 方法)
    • 使用证书创建一个 Keystore 对象(setCertificateEntry 方法)。
    • 创建一个TrustManagerFactory对象,用Keystore对象初始化(init方法,传入Keystore对象)
    • 创建一个 SSLContext 对象,用 TrustManagerFactory 对象初始化(init 方法,传入 TrustManagerFactory.getTrustManagers())
    • 从 SSLContext 对象中获取一个 SSLSocketFactory 对象(getSocketFactory 方法)
    • 创建指向 ASHX 处理程序的 URL 对象
    • 从 URL 对象中获取 URLConnection 对象(openConnection 方法)
    • 将该 URLConnection 对象转换为 HttpsURLConnection 对象。这可能看起来很普通,但要在 PeopleCode 中做到这一点,它需要创建一个自定义转换类和静态方法,因此我在这里引用它(感谢Jim's PeopleSoft Journal)。
    • 从 HttpsURLConnection 获取图片 InputStream 对象(getInputStream 方法)
    • 使用 ImageIO 类的 read 方法从 InputStream 创建一个 BufferedImage 对象(传入 InputStream)
    • 使用 ImageIO 写入方法将该 BufferedImage 对象写入文件对象。
    • 按照this blog post 中的一般步骤,将该文件写入 PeopleSoft 的 EMPL_PHOTO 记录。

    希望将来有人会觉得这很有帮助。这是完整的 PeopleCode 供参考(注意,这只是我绑定到页面的 FieldChange 事件按钮的测试代码):

    Local JavaObject &joCertString, &joUrl, &joUrlConnection, &joInputStream, &joImageIO, &joBufferedImage, &joFile;
    Local JavaObject &joCertificateFactoryClass, &joCertificateFactory, &joCertInputStream, &joCertificate;
    Local JavaObject &joKeystoreClass, &joKeystore, &joTrustManagerFactoryClass, &joTrustManagerFactory;
    Local JavaObject &joSSLContextClass, &joSSLContext, &joSSLFactory, &joCastObjectClass;
    Local any &anyFileData;
    Local Record &recTest;
    Local string &sPhotosCert;
    Local number &nPutResult;
    
    /*Setup CertificateFactory*/
    &sPhotosCert = GetHTMLText(HTML.PHOTOS_CERT);
    &joCertString = CreateJavaObject("java.lang.String", &sPhotosCert);
    &joCertificateFactoryClass = GetJavaClass("java.security.cert.CertificateFactory");
    &joCertificateFactory = &joCertificateFactoryClass.getInstance("X.509");
    &joCertInputStream = CreateJavaObject("java.io.ByteArrayInputStream", &joCertString.getBytes("UTF-8"));
    &joCertificate = &joCertificateFactory.generateCertificate(&joCertInputStream);
    
    /*Create Keystore*/
    &joKeystoreClass = GetJavaClass("java.security.KeyStore");
    &joKeystore = &joKeystoreClass.getInstance("JKS");
    &joKeystore.load( Null, Null);
    &joKeystore.setCertificateEntry("photos", &joCertificate);
    
    /*Create TrustManagerFactory*/
    &joTrustManagerFactoryClass = GetJavaClass("javax.net.ssl.TrustManagerFactory");
    &joTrustManagerFactory = &joTrustManagerFactoryClass.getInstance(&joTrustManagerFactoryClass.getDefaultAlgorithm());
    &joTrustManagerFactory.init(&joKeystore);
    
    /*Create SSLContext and get SSLSocketFactory*/
    &joSSLContextClass = GetJavaClass("javax.net.ssl.SSLContext");
    &joSSLContext = &joSSLContextClass.getInstance("TLS");
    &joSSLContext.init( Null, &joTrustManagerFactory.getTrustManagers(), Null);
    &joSSLFactory = &joSSLContext.getSocketFactory();
    
    /*Create URL*/
    &joUrl = CreateJavaObject("java.net.URL", "https://domain.com/handler.ashx?id=123456");
    
    /*Get URLConnection*/
    &joUrlConnection = &joUrl.openConnection();
    
    /*Cast to HttpsURLConnection*/
    &joCastObjectClass = GetJavaClass("com.domain.CastObject");
    &joUrlConnection = &joCastObjectClass.objectToHttpsURLConnection(&joUrlConnection);
    
    /*Set connection properties*/
    &joUrlConnection.setSSLSocketFactory(&joSSLFactory);
    &joUrlConnection.setRequestMethod("GET");
    
    /*Get InputStream*/
    &joInputStream = GetJavaClass("java.io.InputStream");
    &joInputStream = &joUrlConnection.getInputStream();
    
    /*Get Image From Stream*/
    &joImageIO = GetJavaClass("javax.imageio.ImageIO");
    &joBufferedImage = CreateJavaObject("java.awt.image.BufferedImage", 1, 1, 1);
    &joBufferedImage = &joImageIO.read(&joInputStream);
    
    /*Write Image to File*/
    &joFile = CreateJavaObject("java.io.File", "/temp/URLImage2.jpg");
    &joImageIO.write(&joBufferedImage, "jpg", &joFile);
    
    /*Put the File into a PS record so we can get a BLOB of it*/
    &nPutResult = PutAttachment("record://PSFILE_ATTDET", "013505.jpg", "/temp/URLImage2.jpg");
    
    /*Grab that BLOB*/
    SQLExec("SELECT FILE_DATA FROM PSFILE_ATTDET WHERE ATTACHSYSFILENAME = :1 AND VERSION = 1", "013505.jpg", &anyFileData);
    
    /*Clean up the temp row we inserted*/
    SQLExec("DELETE FROM PSFILE_ATTDET WHERE ATTACHSYSFILENAME = :1 AND VERSION = 1", "013505.jpg");
    
    /*Setup an employee photo record*/
    &recTest = CreateRecord(Record.EMPL_PHOTO);
    &recTest.EMPLID.Value = "013505";
    &recTest.PSIMAGEVER.Value = (Days365(Date3(1999, 12, 31), %Date) * 86400) + (%Time - Time3(0, 0, 0));
    &recTest.EMPLOYEE_PHOTO.Value = &anyFileData;
    
    /*Insert/Update the employee photo record*/
    &recTest.Insert();
    &recTest.Update();
    

    【讨论】:

    • 当我尝试调用 ImageIO 的 write 方法时,我收到错误“调用 Java javax.imageio.ImageIO.write:多个重载匹配。”。但我已经确定了参数,它与你的代码相同。你知道为什么会这样吗?
    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多