2012-02-01 2 views
1

SOLVED! andre의 대답을 사용하여 얻은 지식으로 여러 업로드를 처리하는 php.net post 메서드에서이 예제를 사용했습니다. 이것이 내가 대답으로 선택한 이유입니다. 여기에 있습니다!PHP 여러 파일 업로드 처리 EASY

foreach ($_FILES["userfile"]["error"] as $key => $error) { 
if ($error == UPLOAD_ERR_OK) { 
    if ($x=="0"){ 
    $data=explode(".",$_FILES["userfile"]["name"][$key]); 
    $named=$id[id].".".$data[1]; 
    $x=$x+1; 
    }else{ 
    $data=explode(".",$_FILES["userfile"]["name"][$key]); 
    $named=$id[id]."-".$x.".".$data[1]; 
    $x=$x+1; 
    } 
    $uploaddir = '/home/content/92/8498392/html/items/'.$_POST[catid]; 
    $tmp_name = $_FILES["userfile"]["tmp_name"][$key]; 
    move_uploaded_file($tmp_name, "$uploaddir/$named"); 
} 

}

결과는 첫번째 이미지 45.jpg로 업로드되고, 두 번째로 45-1.jpg 등 업로드! 도움을 주셔서 감사합니다. D

+2

그것이 오류를보고하는 것이 좋다. PHP는 오류를보고하는 데 아주 좋습니다. 불행히도 게시하지 않으면 오류가 무엇을 의미하는지 암호 해독 할 수 없습니다. –

+0

@Francis : 불행히도 나는 스스로 가르치고 있으며, 오류보고에 정말로 나쁘다. 보통 나는 내 자신이 무엇을 잘못 생각할 수 있지만 오류는 단순히 오류라고 말합니다. 스크립트의 해당 부분을 제거하고 이제 데이터베이스를 완료하고 업데이트하지만 파일을 업로드하지는 않습니다. 파일은 1M보다 크지 않으며 제한을 위반하지 않습니다. 그리고 나는 5 개의 파일 만 업로드하고 있으며 파일 제한은 20입니다. dk 경로는 mkdir에서 작동하므로 잘 모르겠습니다. 업로드 된 파일이 잘못되었을 가능성이 있습니까? – HenryGuy

+0

PHP 로그 파일을 살펴보면 오류에 대한 자세한 메시지가 표시됩니다. 오류 로그는 웹 사이트의 conf 파일에 정의되거나 공유 호스팅 서버에있는 경우 제공된 제어판을 통해서만 액세스 할 수 있습니다. –

답변

2

문제는 $ _FILES 배열을 반복하는 방법입니다. 그것은 당신이 생각하기 때문에 여러 함수를 사용하지 않으므로 아래 함수를 사용하고 스크립트에 통합하십시오. 아래의 스크립트에 대한 크레딧은 PHP 사이트의 사용자에게 전달됩니다. 링크가 코드 아래에 있습니다.

function multiple(array $_files, $top = TRUE) 
{ 
    $files = array(); 
    foreach($_files as $name=>$file){ 
     if($top) $sub_name = $file['name']; 
     else $sub_name = $name; 

     if(is_array($sub_name)){ 
      foreach(array_keys($sub_name) as $key){ 
       $files[$name][$key] = array(
        'name'  => $file['name'][$key], 
        'type'  => $file['type'][$key], 
        'tmp_name' => $file['tmp_name'][$key], 
        'error' => $file['error'][$key], 
        'size'  => $file['size'][$key], 
       ); 
       $files[$name] = multiple($files[$name], FALSE); 
      } 
     }else{ 
      $files[$name] = $file; 
     } 
    } 
    return $files; 
} 

print_r($_FILES); 
/* 
Array 
(
    [image] => Array 
     (
      [name] => Array 
       (
        [0] => 400.png 
       ) 
      [type] => Array 
       (
        [0] => image/png 
       ) 
      [tmp_name] => Array 
       (
        [0] => /tmp/php5Wx0aJ 
       ) 
      [error] => Array 
       (
        [0] => 0 
       ) 
      [size] => Array 
       (
        [0] => 15726 
       ) 
     ) 
) 
*/ 
$files = multiple($_FILES); 
print_r($files); 
/* 
Array 
(
    [image] => Array 
     (
      [0] => Array 
       (
        [name] => 400.png 
        [type] => image/png 
        [tmp_name] => /tmp/php5Wx0aJ 
        [error] => 0 
        [size] => 15726 
       ) 
     ) 
) 
*/ 
?> 

나는 그냥 내가 제공하는 기능을 사용하여 아래와 같이 비롯하여 PHP website

+0

@Andrew Honsberg, 이것은 $ files [name]과 $ files [tmp_name] 값을 가지고있는 배열 $ files를 반환 할 것이고 그 파일을 tmp 파일을 새로운 폴더로 옮기고 변경할 수 있습니다. 이름은 이전에 foreach가없는 경우를 제외하고는했던 것과 같은 방법입니까? php.net에서 예제를 많이 읽었지만 이해할 수 없었기 때문에 여기에 왔습니다. 코드에 감사 드리며 몇 가지 테스트를 실행하고이를 사용하려고합니다. 누구든지 내가 한 일의 재촉으로 나를 위로 할 수 있다면 너무 좋을 것이다. D 다시 한번 감사드립니다. – HenryGuy

+0

나는 당신이 말한대로했고 나는 그것을 마침내 이해한다고 생각한다. 그러나 다중 함수를 호출 한 후에 파일을 반복 할 때 오류가 발생한다. 내가 제대로 이해하면 이전 스크립트에서 작동해야합니다. 잘못인가? foreach (multiple ($ _ FILES) as $ file) { if ($ x = "0") { $ data = explode (".", $ files [ 'name']); $ name = $ id. "."$ 데이터 [1]; $ uploaddir = '/home/content/92/8498392/html/items/'.$_POST[catid].'/' '; $ uploadfile = $ uploaddir. $ name; move_uploaded_file ($ files [ 'tmp_name'], $ uploadfile); echo $ uploadfile; $ x = $ x + 1; } – HenryGuy

+0

페이지 끝 부분에 예기치 않은 $ end 오류가 발생하지만 문제가되는 foreach 문을 제거하면 사라져서 여기에 뭔가 빠졌다고 가정합니다. 여러 함수를 사용하여 3 단계 배열에서 2 단계 배열로 배열을 조작 한 후 해당 스크립트로 반복 할 수 있어야합니까? – HenryGuy

1
<?php 
$id = 877; 
$x = 0; 
foreach ($_FILES as $file) { 
    $data = explode(".", $file['userfile']['name']); 
    $fileExtension = $data[count($data)-1]; 
    if ($x == 0) { 
    $filePath = '/home/content/92/8498392/html/items/' . $_POST['catid'] . '/' . $id . '.' . $fileExtension; 
    } 
    else { 
    $filePath = '/home/content/92/8498392/html/items/'.$_POST['catid'].'/' . $id . '-' . $x . '.' . $fileExtension; 
    } 
    move_uploaded_file($file['userfile']['tmp_name'], $filePath); 
    $x++; 
} 
?> 

시도해보십시오.

+0

시도해 보니 불행히도 여전히 작동하지 않습니다. 어떤 파일도 업로드하지 않습니다! 이것이 도움이된다면 이것은 사진을위한 제 형식 필드입니다. 그것들은 모두 그것이 작동하는 것과 같다고 생각합니다. HenryGuy

+0

불행히도 아무 것도 업로드하지 않습니다. 나는 또한 echo $ filepath를 붙였다. move_uploaded_file 이후 아무것도 인쇄되지 않고 ... x는 스크립트와 마찬가지로 0으로 설정됩니다. – HenryGuy

1

에서이 나섭니다 :

<?php 
$id = 877; 
$x = 0; 
$_FILES = multiple($_FILES); // taken from above snippet from php.net 
foreach ($_FILES as $fileKey => $file) { 
    $data = explode(".", $file['name']); 
    $fileExtension = $data[count($data)-1]; 
    if ($x == 0) { 
    $filePath = '/home/content/92/8498392/html/items/' . $_POST['catid'] . '/' . $id . '.' . $fileExtension; 
    } 
    else { 
    $filePath = '/home/content/92/8498392/html/items/'.$_POST['catid'].'/' . $id . '-' . $x . '.' . $fileExtension; 
    } 
    move_uploaded_file($file['tmp_name'], $filePath); 
    $x++; 
} 
?>