我正在尝试在我们的服务器上获取可以在客户端上显示的图像托管。根据项目的规格:
“当客户收到此类网址时,必须下载该网址 URL引用的文件的内容(即字节)。 在客户端向用户显示图像之前,它必须首先检索(即,下载)字节 来自服务器的图像文件。同样,如果客户端收到已知数据文件或字段帮助文件的URL 从服务器,它必须先下载这些文件的内容才能使用它们。“
我很确定我们有服务器端的东西,因为如果我将网址放入浏览器,它会检索并显示正常。所以它必须是ClientCommunicator类的东西;你能看看我的代码并告诉我问题是什么吗?我花了好几个小时。
以下是代码:
我实际调用函数来获取并显示文件:(这部分工作正常,因为它将正确的信息传递给服务器)
JFrame f = new JFrame();
JButton b = (JButton)e.getSource();
ImageIcon image = new ImageIcon(ClientCommunicator.DownloadFile(HOST, PORT, b.getLabel()));
JLabel l = new JLabel(image);
f.add(l);
f.pack();
f.setVisible(true);
来自ClientCommunicator类:
public static byte[] DownloadFile(String hostname, String port, String url){
String image = HttpClientHelper.doGetRequest("http://"+hostname+":"+port+"/"+url, null);
return image.getBytes();
}
相关的httpHelper:
public static String doGetRequest(String urlString,Map<String,String> headers){
URL url;
HttpURLConnection connection = null;
try {
//Create connection
url = new URL(urlString);
connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Content-Language", "en-US");
connection.setUseCaches (false);
connection.setDoInput(true);
connection.setDoOutput(true);
if(connection.getResponseCode() == 500){
return "failed";
}
//Get Response
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuffer response = new StringBuffer();
while((line = rd.readLine()) != null) {
response.append(line);
}
rd.close();
return response.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if(connection != null) {
connection.disconnect();
}
}
}
之后,它跳进服务器的东西,正如我所说,我相信它正常工作,因为Chrome等客户端可以检索文件并正确显示它。问题必须在这里。
我认为它与字节转换为字符串然后返回的方式有关,但我不知道如何解决这个问题。我在StackOverflow上看过类似的问题,并且无法将它们应用到我的情况中。任何指向正确方向的人都会非常感激。
答案 0 :(得分:0)
如果您的服务器正在发送二进制数据,您不希望使用InputStreamReader,或者实际上是任何类型的Reader。正如Java API所指出的,读者用于读取字符流(而非字节)http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html,这意味着您将遇到各种编码问题。
有关如何从流中读取字节的信息,请参阅此其他堆栈溢出答案:
答案 1 :(得分:-1)
不确定作业的具体细节...... 如果您能够使用外部库,则可以尝试使用Apache commons。
http://commons.apache.org/proper/commons-io/
下载并将JAR添加到您的类路径并使用copyURLToFile方法。
org.apache.commons.io.FileUtils.copyURLToFile(URL, File)
它负责所有的家务管理。
答案 2 :(得分:-1)
做好你的作业。