Как обработать <input type = "file" name = "test1 [f]" /> в PHP? - PullRequest
0 голосов
/ 13 марта 2010

var_dump($_FILES) дает следующее:

array
  'test1' => 
    array
      'name' => 
        array
          'f' => string 'ntuser.dat.LOG' (length=14)
      'type' => 
        array
          'f' => string 'application/octet-stream' (length=24)
      'tmp_name' => 
        array
          'f' => string 'D:\wamp\tmp\php223.tmp' (length=22)
      'error' => 
        array
          'f' => int 0
      'size' => 
        array
          'f' => int 0

Почему http разработан таким образом? Как я могу эффективно обработать массив (иногда это означает отсутствие зацикливания?), Чтобы я мог получить файл с помощью $_FILES['test1']['f']?

Ответы [ 3 ]

4 голосов
/ 13 марта 2010

Полагаю, input поля с типом file не предназначены для использования с массивами, такими как имена. Используйте

 <input type="file" name="test1_f" />

вместо этого и доступ с помощью $_FILES['test1_f'].

В противном случае вы не сможете получить доступ к отдельным атрибутам файла без зацикливания.

Может быть, вы сможете показать нам, как вы создаете элементы ввода и как вы хотите обработать массив $_FILES, чтобы обеспечить лучшее решение.

Обновление:
Я должен перерисовать свое заявление частично. Как описано здесь , PHP поддерживает функцию массива HTML также для файлов. Но суть в том, что файлы на стороне сервера должны обрабатываться целиком.
Они также дают хороший пример того, как с этим справиться, может быть, это поможет вам:

foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "data/$name");
    }
}

Если вы хотите иметь доступ к одному файлу, то вы просто используете неправильный подход.

1 голос
/ 13 марта 2010

Кажется, довольно просто:

$filepath = $_FILES["test1"]["tmp_name"]["f"];
0 голосов
/ 13 марта 2010

Вот решение:

  static public function convertFileInformation(array $taintedFiles)
  {
    $files = array();
    foreach ($taintedFiles as $key => $data)
    {
      $files[$key] = self::fixPhpFilesArray($data);
    }
    return $files;
  }
  static protected function fixPhpFilesArray($data)
  {
    $fileKeys = array('error', 'name', 'size', 'tmp_name', 'type');
    $keys = array_keys($data);
    sort($keys);
    if ($fileKeys != $keys || !isset($data['name']) || !is_array($data['name']))
    {
      return $data;
    }
    $files = $data;
    foreach ($fileKeys as $k)
    {
      unset($files[$k]);
    }
    foreach (array_keys($data['name']) as $key)
    {
      $files[$key] = self::fixPhpFilesArray(array(
        'error'    => $data['error'][$key],
        'name'     => $data['name'][$key],
        'type'     => $data['type'][$key],
        'tmp_name' => $data['tmp_name'][$key],
        'size'     => $data['size'][$key],
      ));
    }
    return $files;
  }
...