PHP miniwebsever файл скачать - PullRequest
0 голосов
/ 31 мая 2010

</p>

<p>$httpsock = @socket_create_listen("9090");
  if (!$httpsock) {
    print "Socket creation failed!\n";
    exit;
  }
  while (1) {
    $client = socket_accept($httpsock);
    $input = trim(socket_read ($client, 4096));
    $input = explode(" ", $input);
    $input = $input[1];
    $fileinfo = pathinfo($input);</p>

<pre><code>switch ($fileinfo['extension']) {
  default:
    $mime = "text/html";
}
if ($input == "/") {
  $input = "index.html";
}
$input = ".$input";
if (file_exists($input) && is_readable($input)) {
  echo "Serving $input\n";
  $contents = file_get_contents($input);
  $output = "HTTP/1.0 200 OK\r\nServer: APatchyServer\r\nConnection: close\r\nContent-Type: $mime\r\n\r\n$contents";
} else {
  //$contents = "The file you requested doesn't exist.  Sorry!";
  //$output = "HTTP/1.0 404 OBJECT NOT FOUND\r\nServer: BabyHTTP\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n$contents";
  function openfile()
  {
  $filename = "a.pl";
  $file     = fopen($filename, 'r');
  $filesize = filesize($filename);
  $buffer   = fread($file, $filesize);
  $array    = array("Output"=>$buffer,"filesize"=>$filesize,"filename"=>$filename);
  return $array; 
  }

  $send   = openfile();
  $file   = $send['filename'];
  $filesize  = $send['filesize'];
  $output  = 'HTTP/1.0 200 OK\r\n';
  $output .= "Content-type: application/octet-stream\r\n";
  $output .= 'Content-Disposition: attachment; filename="'.$file.'"\r\n';
  $output .= "Content-Length:$filesize\r\n";
  $output .= "Accept-Ranges: bytes\r\n";
  $output .= "Cache-Control: private\n\n";
  $output .= $send['Output'];
  $output .= "Content-Transfer-Encoding: binary";
  $output .= "Connection: Keep-Alive\r\n";

}
socket_write($client, $output);
socket_close ($client);
</code>

} socket_close ($ httpsock);

Здравствуйте, я snikolov я создаю miniwebserver с php, и я хотел бы знать, как я могу отправить клиенту файл для загрузки с помощью его браузера, такого как Firefox или Интернет. Я отправляю файл пользователю для загрузки через сокеты, но клиент не получает имя файла и информацию для загрузки, пожалуйста, помогите мне здесь, если я снова объявляю файл, я получаю эту ошибку на моем сервере
Неустранимая ошибка : Невозможно повторно объявить openfile () (ранее объявленный в C: \ User s \ fsfdsf \ sfdsfsdf \ httpd.php: 31) в C: \ Users \ hfghfgh \ hfghg \ httpd.php в сети ne 29
, если это возможно, я хотел бы знать, может ли веб-сервер показывать большую ширину полосы при запросе пользователя через сокеты, perl имеет ту же опцию, что и php, но он более хардкорный, чем php. Я много знаю о Perl, я даже видел, что мини-сервер может показать многое, что пользователь клиента извлекает с сервера, если бы вы могли помочь мне с этим кодированием, я очень благодарен вам, ребята.

Ответы [ 3 ]

2 голосов
/ 31 мая 2010

Вы не отправляете имя файла клиенту, так как он должен знать, какое имя файла использовать?

Есть недостаток, вы можете указать желаемое имя файла в заголовке http, но некоторые браузеры игнорируют это и всегда предлагают имя файла на основе последнего элемента в URL. Например, http://localhost/download.php?help.me приведет к тому, что имя файла help.me будет добавлено в диалог загрузки файла.

см .: http://en.wikipedia.org/wiki/List_of_HTTP_headers

1 голос
/ 31 мая 2010

Каждый раз, когда вы запускаете цикл while (1), вы объявляете функцию openfile. Вы можете объявить функцию только один раз. Попробуйте переместить объявление openfile вне цикла.

0 голосов
/ 31 мая 2010

  $httpsock = @socket_create_listen("9090");
  if (!$httpsock) {
    print "Socket creation failed!\n";
    exit;
  }
  while (1) {
    $client = socket_accept($httpsock);
    $input = trim(socket_read ($client, 4096));


    $input = explode(" ", $input);

    $input = $input[1];

    $fileinfo = pathinfo($input);

    switch ($fileinfo['extension']) {
      default:
        $mime = "text/html";
    }
    if ($input == "/") {
      $input = "index.html";
    }
    $input = ".$input";
    if (file_exists($input) && is_readable($input)) {
      echo "Serving $input\n";
      $contents = file_get_contents($input);
      $output = "HTTP/1.0 200 OK\r\nServer: APatchyServer\r\nConnection: close\r\nContent-Type: $mime\r\n\r\n$contents";
    } else {
      //$contents = "The file you requested doesn't exist.  Sorry!";
      //$output = "HTTP/1.0 404 OBJECT NOT FOUND\r\nServer: BabyHTTP\r\nConnection: close\r\nContent-Type: text/html\r\n\r\n$contents";

      $filename = "dada";
      $file     = fopen($filename, 'r');
      $filesize = filesize($filename);
      $buffer   = fread($file, $filesize);
      $send     = array("Output"=>$buffer,"filesize"=>$filesize,"filename"=>$filename);

      $file   = $send['filename'];

      $output  = 'HTTP/1.0 200 OK\r\n';
      $output .= "Content-type: application/octet-stream\r\n";
      $output .= "Content-Length: $filesize\r\n";
      $output .= 'Content-Disposition: attachment; filename="'.$file.'"\r\n';
      $output .= "Accept-Ranges: bytes\r\n";
      $output .= "Cache-Control: private\n\n";
      $output .= $send['Output'];
      $output .= "Pragma: private\n\n";
     // $output .= "Content-Transfer-Encoding: binary";
      //$output .= "Connection: Keep-Alive\r\n";

    }
    socket_write($client, $output);
    socket_close ($client);
  }
  socket_close ($httpsock);
 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...