0

我一直在这个网站上冲浪,寻找一个例子或“隧道尽头的光”,关于如何编写代码,让我从 PHP 的 REST 服务器下载文件到 JAVA 的客户端。

客户端将使用文件 ID 发出 GET 请求,然后 PHP REST 代码应响应该文件,JAVA 接收该文件并将其存储在硬盘中。

任何想法...?我试着做这样的PHP Rest服务器......:

$file = 'path_to_file/file.mp3';
$content = readfile($file);

而这个 $content var,作为响应发送......

客户...我写的是:

try {
    URL url = new URL("url/to/rest/server");
    HttpURLConnection conn (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Accept", "Content-Disposition: filename\"music.mp3\"");

    if(conn.getResponseCode() != 200) {
        throw new RuntimeException("Failed : HTTP error code: " + conn.getResponseCode());
    }

    BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));

    try {
        String output;
        File newFile = newFile("/some/path/file.mp3");
        fileWriter fw = new FileWriter(newFile);

        while ((output = br.readLine()) != null) {
            fw.write(output);
        }
        fw.close();
    } catch (IOException iox) {
        //do
    }
} catch (MalformedURLException e) {
    //do
}

我的示例的问题是,当我收到客户端上的文件有点损坏或其他东西时!...在我的 mp3 文件示例中,客户端上的任何音乐播放器都说该文件已损坏或无法正常工作.

谢谢你的帮助。

4

1 回答 1

0

在处理二进制数据(MP3 文件)时,您应该使用InputStreamOutputStream而不是 Readers/Writers。此外, BufferedReader.readLine() 也会从输出中删除任何“换行符”。

因为您使用的是 Readers/Writers,所以二进制数据正在转换为字符串,我确信发生了很多损坏。

尝试以下操作:

InputStream is = conn.getInputStream();
byte[] buffer = new byte[10240]; // 10K is a 'reasonable' amount

try {
    File newFile = newFile("/some/path/file.mp3");
    FileOutputStream fos = new FileOutputStream(newFile);

    int len = 0;
    while ((len = is.read(buffer)) >= 0) {
        fos.write(buffer, 0, len);
    }
    fos.close();
} catch (IOException iox) {
    //do
}
于 2013-10-21T21:36:05.437 回答