배열을 이용한 업로드 로직이 잘 안풀리네요. > 질문&답변

본문 바로가기
사이트 내 전체검색

질문&답변

DreamPHP.com에서 다루는 내용(PHP, 프로그램, 고전)에 대해서만 질문 남겨주세요.
기타 질문은 PHP스쿨의 아래 성격에 맞는 게시판에 올리면 됩니다.
리눅스/서버/설치/설정 ,  Mysql/Oracle/Query/DB ,  PHP/함수/API/프레임웍 ,  HTML/JS/CSS/jQuery/Ajax
모바일앱/하이브리드앱 ,  ASP/JSP/기타개발관련 ,  개발을 제외한 일반질문

배열을 이용한 업로드 로직이 잘 안풀리네요.

페이지 정보

작성자 php열공! 댓글 4건 조회 333회 작성일 18-02-28 16:37

본문

▶ PHP스쿨 > Q&A > PHP관련/함수/프레임웍 - https://phpschool.com/link/qna_function/456698

배열을 이용하여 업로드 로직을 만들고 있습니다.
<input type="file" name="upfile[]">
foreach에서 upfile을 배열로 받아서 파일을 업로드하고자 하는데요..
아래 소스처럼 코딩하면 파일 갯수에 따라서 파일명이 늘어납니다.

예를 들어 파일명 test1.jpg, test2.jpg 의 2개 파일을 넘겨보면
test1
test1test2
위에 처럼 출력이 되네요.

$upfile_nm = $_FILES['upfile']['name'][$k]; //원래 파일명 <= 이부분이 문제 인것 같은데
" [$k] "부분을 빼면 아예 출력조차 안되서 답이 안나오네요 ㅠㅠ

[ ▼ 질문관련 참고 Source ]
================================================================================
foreach ($_POST['sub_no'] as $k=>$upfile)
{
$sub_no = $_POST['sub_no'][$k];
        $upfile = $_FILES['upfile']['tmp_name'][$k];

        if(!$upfile) continue;

    if($upfile){
            $upfile_nm = $_FILES['upfile']['name'][$k]; //원래 파일명
            $file_type_chk = explode('.', $upfile_nm); //파일명 추출을 위한 배열  생성
            //print_r($file_type_chk);
            $file_type = $file_type_chk[count($file_type_chk)-1]; //파일 확장자 체크
            //echo $file_type;
           
            //확장자를 제외한 파일명 추출
            $i = 0;
            while($i < count($file_type_chk)-1){
                $real_filename .= $file_type_chk[$i];
                $i++;
            }
            echo $real_filename."<br>";
        }
    }
================================================================================

댓글목록

ArchEviL™님의 댓글

ArchEviL™ 작성일

$_POST가 아니라 $_FILES를 foreach로 돌리셔야 합니다.

php열공!님의 댓글

php열공! 작성일

제가 이해가 안돼서 그러는데요.. 조금 쉽게 풀어서 말씀해 주실 수 없으실까요? ㅠㅠ

ArchEviL™님의 댓글

ArchEviL™ 작성일

const EXT = ['gif', 'jpe', 'jpeg', 'jpg', 'png']; // 확장자 지정
foreach ($_FILES as $fieldname => $file) {
  ["tmp_name"=> $tmp_name_, "name"=> $name, "size"=> $size, "type"=> $type, "error"=> $error] = $file;

  if(!is_array($tmp_name_)){ // 단일 파일 업로드인 경우
    $tmp_name_ = (array) $tmp_name_;
    $name = (array) $name;
    $size = (array) $size;
    $type = (array) $type;
    $error = (array) $error;
  }
  foreach($tmp_name_ as $k => $tmp_name){
    if(is_uploaded_file($tmp_name)){
      ["filename"=> $filename, "extension"=> $ext] = pathinfo($name[$k]);
      if(in_array($ext, EXT)){
        // 확장자가 맞는 경우
      }
      else {
        // 확장자가 틀린 경우
      }
    }
    else {
      // 파일 업로드가 되지 않았을 경우
    }
  }
}

대략 이런 코드입니다.

BiHon님의 댓글

BiHon 작성일

일단 질문의 원인은 18라인에서 일어납니다.
초기화 없이 같은 변수에 계속해서 연결해서 그렇습니다.

+ 복수 파일 전송하기
- http://php.net/manual/en/features.file-upload.multiple.php
- http://php.net/manual/kr/features.file-upload.multiple.php

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

업로드한 파일의 정보값 접근은 아래처럼 하면 됩니다.
그대로 실행해보세요.

foreach ($_FILES['upfile']['name'] as $k=>$name) { // 원본 파일명 반복
    echo '원본 파일명 : '.$name.'<br>'; // = $_FILES['upfile']['name'][$k]
    $fileinfo = pathinfo($name);
    echo '파일명 : '.$fileinfo['filename'].'<br>';
    echo '확장자 : '.strtolower($fileinfo['extension']).'<br>'; // = pathinfo($name, PATHINFO_EXTENSION)
    echo '임시 파일명 : '.$_FILES['upfile']['tmp_name'][$k].'<br>';
    echo '파일 MIME : '.$_FILES['upfile']['type'][$k].'<br>';
    echo '오류 코드 : '.$_FILES['upfile']['error'][$k].'<br>';
    echo '파일 용량 : '.$_FILES['upfile']['size'][$k].'<br>';
    echo '<br>';
}

회원로그인


Copyright © 1998~2019 DreamPHP.com All rights reserved.