Ich habe einen Server bauen PHP auf WAMP Server auf meinem Windows 10 Computer verwenden. was ich tun möchte ist, wenn ich eine GET-Anfrage senden, die show_files.php
sollte ein JSON-Objekt an mich zurückgeben. Das JSON-Objekt enthält Dateinamen in Pfad F:\NetEaseMusic\download
auf meinem Computer. Dann benutze ich einen Dateinamen, um eine POST-Anfrage an download_file.php
zu senden, und es gibt einen Datenstrom zurück, so dass ich die Datei herunterladen kann. Wenn ich HttpURLConnection
verwende, funktioniert alles gut. Allerdings, wenn ich versuche, senden Sie die POST-Anfrage verwenden Socket, download_file.php
kann die file_name
param erhalten, aber es kann die Zieldatei in F:\NetEaseMusic\download
nicht finden. Ich zeige den Code. diesPHP kann keine Dateien in Windows finden
dies
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();
?>
dies ist mein Client-Code die Datei herunterzuladen. Als erstes habe ich eine HTTP-POST-Anfrage bauen,
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();
}
}
und mein Haupt [Methode]
public static void main(String[] args)
{
SocketTest socketTest = new SocketTest();
socketTest.downloadFileBySocket(SocketTest.downloadFileUrl, "小胡仙儿 - 【二胡】霜雪千年.mp3");
}
http: // www .csharp-examples.net/download-files/ –
Ich habe es gewühlt. Ich entferne einfach "\ r \ n" aus "Daten", es funktioniert. Ich stoße jedoch auf ein anderes Problem. Ich finde '\ r \ n2000 \ r \ n' wird in den Socket-Input-Stream hinzugefügt, wenn ich eine große Datei herunterlade. Ich schreibe es in Socket, um net zu lernen. – zuguorui
http://stackoverflow.com/questions/25971067/response-xml-contains-2000-and-20a0-characters –