2017-02-27 2 views
0

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"); 
} 

Antwort

0

einfache Art und Weise:

using System.Net; 
WebClient webClient = new WebClient(); 
webClient.DownloadFile("example.com/myfile.txt", @"c:/myfile.txt"); 
+0

http: // www .csharp-examples.net/download-files/ –

+0

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

+0

http://stackoverflow.com/questions/25971067/response-xml-contains-2000-and-20a0-characters –

Verwandte Themen