2017-02-27 8 views
0

私はWindowsサーバ上のWAMPサーバに基づいてPHPを使用してPHPを構築しています。私がしたいことは、GETリクエストを送信するときです。show_files.phpは私にJSONオブジェクトを返さなければなりません。 JSONオブジェクトには、コンピュータ上のパスF:\NetEaseMusic\downloadのファイル名が含まれています。次に、ファイル名を使用してdownload_file.phpにPOSTリクエストを送信し、データストリームを返してファイルをダウンロードできるようにします。 HttpURLConnectionを使用すると、すべて正常に動作します。しかし、POST要求ソケットを送信しようとすると、download_file.phpfile_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"); 
} 

答えて

0

簡単な方法:

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

私はそれをうなずきました。私はちょうど "データ"の "\ r \ n"を取り除いて、それは動作します。しかし、私は別の問題を抱えています。大きなファイルをダウンロードすると、 '\ r \ n2000 \ r \ n'がソケット入力ストリームに追加されます。ネットで学ぶためにソケットに書きます。 – zuguorui

+0

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

関連する問題