如何通过HttpURLConnection传递文件

时间:2014-04-17 21:26:41

标签: java httpurlconnection

我正在尝试在我们的服务器上获取可以在客户端上显示的图像托管。根据项目的规格:

“当客户收到此类网址时,必须下载该网址 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上看过类似的问题,并且无法将它们应用到我的情况中。任何指向正确方向的人都会非常感激。

3 个答案:

答案 0 :(得分:0)

如果您的服务器正在发送二进制数据,您不希望使用InputStreamReader,或者实际上是任何类型的Reader。正如Java API所指出的,读者用于读取字符流(而非字节)http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html,这意味着您将遇到各种编码问题。

有关如何从流中读取字节的信息,请参阅此其他堆栈溢出答案:

Convert InputStream to byte array in Java

答案 1 :(得分:-1)

不确定作业的具体细节...... 如果您能够使用外部库,则可以尝试使用Apache commons。

http://commons.apache.org/proper/commons-io/

下载并将JAR添加到您的类路径并使用copyURLToFile方法。

org.apache.commons.io.FileUtils.copyURLToFile(URL, File)

它负责所有的家务管理。

答案 2 :(得分:-1)

做好你的作业。

  1. 隔离问题。修改服务器端以仅发送256个所有可能的字节。进行二进制搜索并将其减少为一小组字节。
  2. 使用http代理工具监视传输的字节数。在Windows世界的提琴手。查找* nix环境中的其他内容。
  3. 然后查看问题发生的位置,并查看怀疑或分享结果。