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

使用Java从ASHX URL检索图像(在PeopleSoft PeopleCode中),java,image,ashx,Java,Image,Ashx,我需要从.NET ASHX处理程序中重复提取图像,该处理程序遵循ID标识处理程序应该为其提供图像的人的形式。我必须在PeopleSoft应用程序中执行此操作,因此我在大部分情况下仅限于PeopleCode中提供的内容,但也可以使用大量Java(尽管从语法上讲,这对纯Java开发人员来说没有多大意义)。到目前为止我所能做的 使用URL类和URLConnection类的openConnection方法打开到URL的连接,最终得到一个InputStream对象 然后,我尝试使用ImageIO类使用r

我需要从.NET ASHX处理程序中重复提取图像,该处理程序遵循ID标识处理程序应该为其提供图像的人的形式。我必须在PeopleSoft应用程序中执行此操作,因此我在大部分情况下仅限于PeopleCode中提供的内容,但也可以使用大量Java(尽管从语法上讲,这对纯Java开发人员来说没有多大意义)。到目前为止我所能做的

  • 使用URL类和URLConnection类的openConnection方法打开到URL的连接,最终得到一个InputStream对象
  • 然后,我尝试使用ImageIO类使用read方法检索BuffereImage对象,并传入前面提到的InputStream对象
  • 此时,BuffereImage对象始终返回“null”。似乎返回的不是图像,而是HTML的简短简介
  • 如果我使用指向URL的直接路径(例如,没有查询字符串),我的方法工作得很好,并且我能够处理返回的BuffereImage对象
  • 我尝试过使用setRequestProperty方法在URLConnection上显式设置用户代理字符串,正如这里的另一篇文章所建议的那样,但没有效果

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

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

首先,我之所以要返回我引用的“HTML简介”,是因为我指向的URL正在重定向到另一台服务器

一旦我弄明白了这一点并指向“真正的”服务器,我就开始收到SSL证书信任错误。在本例中,服务器具有内部自签名证书。我尝试在我的PeopleSoft web服务器和PeopleSoft的数字证书库中简单地安装该证书,但没有成功。然后我继续计划B:强制我的PeopleCode/Java混合使用证书本身

在很大程度上,它帮助我找到了我需要做的事情。总的来说,我采取了以下步骤:

  • 基于PEM格式化的证书字符串创建CertificateFactory
  • 从证书工厂获取证书对象(generateCertificate方法)
  • 使用证书(setCertificateEntry方法)创建密钥库对象
  • 创建一个TrustManagerFactory对象,用密钥库对象初始化(init方法,传入密钥库对象)
  • 创建一个SSLContext对象,用TrustManagerFactory对象初始化(init方法,传入TrustManagerFactory.getTrustManagers())
  • 从SSLContext对象(getSocketFactory方法)获取SSLSocketFactory对象
  • 创建URL对象,指向ASHX处理程序
  • 从URL对象获取URLConnection对象(openConnection方法)
  • 将该URLConnection对象强制转换为HttpsURLConnection对象。这可能看起来很平常,但要在PeopleCode中实现这一点,需要创建一个定制的cast类和静态方法,因此我在这里引用它(这一点值得赞扬)
  • 从HttpsURLConnection获取图像InputStream对象(getInputStream方法)
  • 使用ImageIO类的读取方法(传入InputStream)从InputStream创建BuffereImage对象
  • 使用ImageIO写入方法将BuffereImage对象写入文件对象
  • 按照中的一般步骤,将该文件写入PeopleSoft的Emp_照片记录
希望将来有人会觉得这很有帮助。以下是完整的PeopleCode供参考(注意,这只是我绑定到页面FieldChange事件按钮上的测试代码):


当我试图调用ImageIO的write方法时,我得到一个错误“callingJavajavax.ImageIO.ImageIO.write:多个重载匹配”。但是我已经确定了参数,它和你的代码是一样的。你知道为什么会这样吗?
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();