java - 使用 Java 从 ASHX URL 检索图像(在 PeopleSoft PeopleCode 中)

标签 java image ashx

我需要从 .NET ASHX 处理程序中重复提取图像,其格式为 http://domain.com/handler.ashx?id=013505其中 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 上显式设置用户代理字符串,但无济于事。

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

最佳答案

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

首先,我之所以返回我引用的“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 方法)
  • 创建 URL 对象,指向 ASSX 处理程序
  • 从 URL 对象获取 URLConnection 对象(openConnection 方法)
  • 将该 URLConnection 对象转换为 HttpsURLConnection 对象。这可能看起来很平常,但要在 PeopleCode 中做到这一点,需要创建一个自定义转换类和静态方法,因此我在这里引用它(这要归功于 Jim's PeopleSoft Journal)。
  • 从 HttpsURLConnection 获取图像 InputStream 对象(getInputStream 方法)
  • 使用 ImageIO 类的 read 方法(传入 InputStream)从 InputStream 创建 BufferedImage 对象
  • 使用 ImageIO write 方法将该 BufferedImage 对象写入 File 对象。
  • 按照 this blog post 中的一般步骤将该文件写入 PeopleSoft 的 EMPL_PHOTO 记录。

希望将来有人会发现这有帮助。以下是完整的 PeopleCode 供引用(请注意,这只是我绑定(bind)到页面 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();

关于java - 使用 Java 从 ASHX URL 检索图像(在 PeopleSoft PeopleCode 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18921658/

相关文章:

java - 从全局范围内的 XML 资源文件获取字符串值

java - 如何将 ArrayList 传递给可变参数方法参数?

HTML/CSS - 获取文本以覆盖图像时遇到问题

JavaScript - 取图像中心

c# - 如何使用 Web 处理程序创建 PDF?

asp.net - 从虚拟 URL 播放视频文件

java - 从 64 位 Java 应用程序访问 32 位 COM DLL(未找到注册表项)

java - 在java运行时抢占一个线程为另一个线程

android - iText,将图像添加到 pdf 时出现 FileNotFoundException

c# - 如何使用 ashx 处理程序识别下载是否完成