私はWindowsサーバ上のWAMPサーバに基づいてPHPを使用してPHPを構築しています。私がしたいことは、GETリクエストを送信するときです。show_files.php
は私にJSONオブジェクトを返さなければなりません。 JSONオブジェクトには、コンピュータ上のパスF:\NetEaseMusic\download
のファイル名が含まれています。次に、ファイル名を使用してdownload_file.php
にPOSTリクエストを送信し、データストリームを返してファイルをダウンロードできるようにします。 HttpURLConnection
を使用すると、すべて正常に動作します。しかし、POST要求ソケットを送信しようとすると、download_file.php
はfile_name
パラメータを取得できますが、ターゲットファイルはF:\NetEaseMusic\download
で見つかりません。私はコードを示します。 これはPHPはウィンドウ内のファイルを見つけることができません
あり、これは、このファイルをダウンロードするために私のクライアントコードである
download_file.php
<?php
if(empty($_POST["file_name"]))
{
echo "NO_FILE_NAME\n";
print_r($_POST);
exit();
}
$path = iconv("utf-8", "GB2312","F:\\NetEaseMusic\\download\\".$_POST["file_name"]);
//$path = "F:\\NetEaseMusic\\download\\".$_POST["file_name"];
if (!file_exists ($path)) {
echo "FILE_NOT_FOUND\n";
echo "F:\\NetEaseMusic\\download\\".$_POST["file_name"]."\n";
print($path);
exit();
}
$file_size = filesize($path);
//header("Content-type: application/octet-stream");
//header("Accept-Ranges: bytes");
//header("Accept-Length:".$file_size);
//header("Content-Disposition: attachment; filename=".$path);
$file = fopen($path, "r");
while(!feof($file))
{
echo fread($file, 1024);
}
exit();
?>
です。 、私はHTTPのPOSTリクエストを構築まず
と私のメインの[]方法private void downloadFileBySocket(String urlString, String fileName) { try{ StringBuilder sb = new StringBuilder(); String data = URLEncoder.encode("file_name", "utf-8") + "=" + URLEncoder.encode(fileName, "utf-8") + "\r\n"; //String data = "&file_name="+fileName; sb.append("POST " + urlString + " HTTP/1.1\r\n"); sb.append("Host: 10.206.68.242\r\n"); sb.append("Content-Type: application/x-www-form-urlencoded\r\n"); sb.append("Content-Length: " + data.length() + "\r\n"); sb.append("\r\n"); sb.append(data + "\r\n"); //sb.append(URLEncoder.encode("file_name", "utf-8") + "=" + URLEncoder.encode(fileName, "utf-8") + "\r\n"); System.out.println(sb.toString()); URL url = new URL(urlString); Socket socket = new Socket(url.getHost(), url.getPort()); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8")); writer.write(sb.toString()); writer.flush(); File file = new File("./" + fileName); DataOutputStream out = null; DataInputStream in = null; try{ out = new DataOutputStream(new FileOutputStream(file)); in = new DataInputStream(socket.getInputStream()); byte[] buffer = new byte[1024]; int readBytes = 0; while((readBytes = in.read(buffer)) != -1) { out.write(buffer, 0, readBytes); } out.flush(); }catch (Exception e1) { e1.printStackTrace(); }finally { try{ if(in != null) { in.close(); } if(out != null) { out.close(); } }catch (Exception e2) { e2.printStackTrace(); } } socket.close(); }catch (Exception e) { e.printStackTrace(); } }
public static void main(String[] args)
{
SocketTest socketTest = new SocketTest();
socketTest.downloadFileBySocket(SocketTest.downloadFileUrl, "小胡仙儿 - 【二胡】霜雪千年.mp3");
}
のhttp:// WWW .csharp-examples.net/download-files/ –
私はそれをうなずきました。私はちょうど "データ"の "\ r \ n"を取り除いて、それは動作します。しかし、私は別の問題を抱えています。大きなファイルをダウンロードすると、 '\ r \ n2000 \ r \ n'がソケット入力ストリームに追加されます。ネットで学ぶためにソケットに書きます。 – zuguorui
http://stackoverflow.com/questions/25971067/response-xml-contains-2000-and-20a0-characters –