2009-09-03 54 views
3

在工作中,我一直在处理一些包含多个图像上传字段的复杂表单(发布页面为Symphony)。我需要一种快速合并$_FILES$_POST的方法,遗憾的是,您不能简单地将这两个合并为array_merge,因为它们不遵循相同的结构。合并PHP中的文件和发布数据

基本上如果你有$_POST[a][b]它将是$_FILES[a][*][b]。将*替换为name,type,tmp_name,errorsize之一。

$_FILES阵列作为标准的内容:

array 
    'image-a' => array 
     'name' => string '' (length=0) 
     'type' => string '' (length=0) 
     'tmp_name' => string '' (length=0) 
     'error' => int 4 
     'size' => int 0 
    'image-b' => array 
     'name' => string '' (length=0) 
     'type' => string '' (length=0) 
     'tmp_name' => string '' (length=0) 
     'error' => int 4 
     'size' => int 0 
    'image' => array 
     'name' => array 
      'sub' => array 
       'c' => string '' (length=0) 
     'type' => array 
      'sub' => array 
       'c' => string '' (length=0) 
     'tmp_name' => array 
      'sub' => array 
       'c' => string '' (length=0) 
     'error' => array 
      'sub' => array 
       'c' => int 4 
     'size' => array 
      'sub' => array 
       'c' => int 0 

和所需的阵列$_POST合并后:

array 
    'MAX_FILE_SIZE' => string '5242880' (length=7) 
    'image-a' => array 
     'name' => string '' (length=0) 
     'type' => string '' (length=0) 
     'tmp_name' => string '' (length=0) 
     'error' => int 4 
     'size' => int 0 
    'image-b' => array 
     'name' => string '' (length=0) 
     'type' => string '' (length=0) 
     'tmp_name' => string '' (length=0) 
     'error' => int 4 
     'size' => int 0 
    'image' => array 
     'sub' => array 
      'c' => array 
       'name' => string '' (length=0) 
       'type' => string '' (length=0) 
       'tmp_name' => string '' (length=0) 
       'error' => int 4 
       'size' => int 0 
+0

那么它应该是通讯unity wiki ... – ariefbayu 2009-09-03 05:26:55

+0

gnarf,由于历史原因,$ _FILES'具有不同于'$ _POST'的结构。 – 2009-09-03 06:29:44

+0

哦,等待 - 从不知道 - 我看到了你现在引用的区别.. $ _FILES的Hierarcial模式很奇怪......删除我之前的注释,并在你的示例中添加一个var_dump的$ _FILES数组。 – gnarf 2009-09-03 06:41:34

回答

1

这是我想出了一个解决方案,呼吁get_file_post_data返回合并array:

<?php 

    if (!empty($_POST)) { 
     header('content-type: text/plain'); 

     function merge_file_post_data($type, $file, &$post) { 
      foreach ($file as $key => $value) { 
       if (!isset($post[$key])) $post[$key] = array(); 
       if (is_array($value)) merge_file_post_data($type, $value, $post[$key]); 
       else $post[$key][$type] = $value; 
      } 
     } 

     function get_file_post_data() { 
      $files = array(
       'name'  => array(), 
       'type'  => array(), 
       'tmp_name' => array(), 
       'error'  => array(), 
       'size'  => array() 
      ); 
      $post = $_POST; 

      // Flip the first level with the second: 
      foreach ($_FILES as $key_a => $data_a) { 
       foreach ($data_a as $key_b => $data_b) { 
        $files[$key_b][$key_a] = $data_b; 
       } 
      } 

      // Merge and make the first level the deepest level: 
      foreach ($files as $type => $data) { 
       merge_file_post_data($type, $data, $post); 
      } 

      return $post; 
     } 

     var_dump(get_file_post_data()); 
    } 

    else echo ' 
     <form action="" method="post" enctype="multipart/form-data"> 
      <input name="MAX_FILE_SIZE" type="hidden" value="5242880"> 
      <div><label class="file">Image A <input name="image-a" type="file"></label></div> 
      <div><label class="file">Image B <input name="image-b" type="file"></label></div> 
      <div><label class="file">Image C <input name="image[sub][c]" type="file"></label></div> 
      <div><button type="submit">Send</button></div> 
     </form> 
    '; 

?>