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

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

  • 짧은주소 : http://dreamphp.com/s/m0bogk

  • 작 성 자 : php열공!

  • 조 회 수 : 183

  • 등 록 일 : 2018-02-28 16:37:26

  • ▶ 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>";
            }
        }
    ================================================================================
  • 2018-02-28 16:40:00

  • ArchEviL™

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

  • 2018-02-28 16:44:00

  • php열공!

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

  • 2018-02-28 16:49:00

  • 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 {
          // 파일 업로드가 되지 않았을 경우
        }
      }
    }

    대략 이런 코드입니다.

  • 2018-02-28 18:41:00

  • BiHonHomepage

  • 일단 질문의 원인은 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>';
    }

+ 이름

- 홈페이지

+ 내용

+ 비밀번호

* 4~20자

+ CAPTCHA

CAPTCHA Image [새로고침] (대소문자 무시)

  • 번호

  • 제목

  • 이름

  • 등록일

  • 조회수