2017-01-17 1 views
0

나는 많은 정보를 수집 한 양식을 가지고 있으며 여러 파일을 업로드해야합니다.여러 파일을 서버로 업로드

이 포럼의 Devi 덕분에이 양식의 다른 모든 측면이 완벽하게 작동하고 있습니다. 이제는 하나의 문제에만 집중하고 새로운 스레드를 시작하기로 결정했습니다. 이전/이전 스레드를 볼 수 있습니다. Insert into one Table, while updating another & File Upload

내 문제는 실제로 파일을 업로드하는 것입니다. 내 양식은 두 부분으로 진행됩니다. Part 1은 기본 HTML 레이아웃으로, 데이터베이스 테이블에 대한 정보 쓰기를 처리하는 PHP 파일을 가리키는 메소드가 있습니다.

<div class="form-group"> 
    <label>Permit Renewal :</label> 
    <div class="input-group"> 
     <label> 
     <input type="radio" class="minimal" value="0" <?php echo ($permit_renewal=='No')?'checked':'' ?> name="permit_renewal"> 
     No 
     </label> 

     <label> 
     <input type="radio" class="minimal" value="1" <?php echo ($permit_renewal=='Yes')?'checked':'' ?> name="permit_renewal"> 
     Yes 
     </label> 
    </div> 
</div> 
<div class="box-body"> 
<div class="form-group">  
    <div class="form-group"> 
     <label for="scanned_permit_renewal">Attach File</label> 
     <input type="file" id="scanned_permit_renewal" name="scanned_permit_renewal"> 
     <p class="help-block">Select a file to link to this outlet, the file name must be prefixed with the Outlet. E.g. 102987 - License 2016</p> 
    </div>     
</div><!-- /.form-group --> 

그리고 :

형태는 각각의 파일 업로드 (. 다른 파일 참조 4 개 업로드, 각이있다 즉 라이센스 문서, 갱신 문서, 신원 문서, 기타 문서)에 대한 다음과 같은 코드가 있습니다 관련 처리 부분은 내가 아니라 내 부패 디렉토리를 확인하고/업로드/폴더 존재가 있다는 것을 보장 한

if (isset($_FILES["file"]["name"])) { 
    foreach($_FILES['file']['tmp_name'] as $key => $tmp_name){ 
     $file_name = $key.$_FILES['file']['name'][$key]; 
     $file_size =$_FILES['file']['size'][$key]; 
     $file_tmp =$_FILES['file']['tmp_name'][$key]; 
     $file_type=$_FILES['file']['type'][$key]; 
     $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name; 
     //echo $new_file; 
     move_uploaded_file($file_tmp,$new_file); 
    } 
} 
if($res1){ 
    echo "Records added/updated successfully."; 
} 

header("refresh:2;url=../outlet_capture.php"); 
// close connection 
$link->close(); 

입니다. 당신이 바로 모든 일을 한

+0

JFYI를,이 사이트가 아닙니다 포럼 및 코드를 수정하도록 요청하는 질문은 주제와 관련이 없습니다. –

답변

0

, 당신은 단순히

$_FILES['file']

가 존재하지 않는 ... 올바른 입력 이름을 가리키는되지 않습니다. $_POST에 액세스 할 때와 마찬가지로 $_FILES['scanned_permit_renewal']을 사용해야하며 키는 양식 필드의 이름입니다.

실제로 입력란에 file[*something*]이라는 많은 입력을 넣은 것처럼 $_FILES['file']을 반복합니다. 질문이 완료되면 간단히 사용해야합니다.

if (isset($_FILES["scanned_permit_renewal"])) { 
    $file_name = $_FILES['scanned_permit_renewal']['name']; 
    $file_size =$_FILES['scanned_permit_renewal']['size']; 
    $file_tmp =$_FILES['scanned_permit_renewal']['tmp_name']; 
    $file_type=$_FILES['scanned_permit_renewal']['type']; 
    $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name; 
    //echo $new_file; 
    move_uploaded_file($file_tmp,$new_file); 
} 

의견을 작성 하시려면 효과적인 방법은 2 가지 방법이 있습니다. 먼저 PHP 변경이 필요하지 않으며 입력 필드의 이름을 file[scanned_permit_renewal]으로 변경하면 foreach을 사용하게됩니다. $_FILES 배열을 통해 단지 루프 일 수

$file_inputs = array('scanned_permit_renewal','my','other','documents'); 
foreach($file_inputs as $input_name){ 
    if (isset($_FILES[$input_name])) { 
     $file_name = $input_name.$_FILES[$input_name]['name']; 
     $file_size =$_FILES[$input_name]['size']; 
     $file_tmp =$_FILES[$input_name]['tmp_name']; 
     $file_type=$_FILES[$input_name]['type']; 
     $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name; 
     //echo $new_file; 
     move_uploaded_file($file_tmp,$new_file); 
    } 
} 

세 번째 방법 :

다른 방법은 가능한 입력의 어레이를 사용할 수 있었다. 그러나 나는 거기에 아무것도있을 수 있으므로 그렇게하지 않을 것입니다. 원하는 파일을 필터링하는 것이 더 좋습니다.

+0

그래서 내가 추가하고 싶은 각 파일에 대해 다음과 같은 코드 섹션을 추가해야합니다. if (isset ($ _ FILES [ "file"] [ "name"])) { foreach ($ _ FILES [ 'file'] [ 'tmp_name'] $ key => $ tmp_name) 등으로 ...? 더 쉽고/더 효율적인 방법이 없습니까? –

+0

좋아, 옵션 2 나를 위해 최선을 다룰 것입니다, 필자는 나중에 데이터베이스 이름을 표시 할 수있는 파일 이름을 참조 할 수 있도록 내 데이터베이스 테이블에 4 개의 별도의 열에 필드 값을 작성해야합니다. 입력 배열을 사용하여 처음 시도한 것이 작동하지 않으므로이를 시도해 보도록하겠습니다. –

+0

이름 충돌이있을 수 있으므로 원본 파일 이름을 사용하지 않는 것을 선호 할 수 있습니다. 파일과 관련된 mysql 행의 ID를 사용하고 파일 유형을 추가합니다. 이렇게하면 데이터베이스에 파일 이름을 저장할 필요가 없으며 두 사람이 동일한 파일 이름을 사용하면 서로를 덮어 쓰지 않아 매우 위험 할 수 있습니다. – Salketer

0

정의가 표시되지 않습니다하지만

$ _FILES 변수 형태로 필드의 이름과 함께 작동처럼에 enctype을해야합니다. 예를 들어 scan_permit_renewal이어야합니다. 그리고 폼이 전송되었을 때 PHP에서 액세스하려면 $ _FILES [ 'scanned_permit_renewal']을 사용해야합니다.

당신은 문제가 될 것 같다 foreach는

foreach($_FILES['file']['tmp_name'] as $key => $tmp_name) 

에 사용합니다.

이 사용해야 IMHO : 여러 파일을 업로드

foreach($_FILES as $fieldNameInTheForm => $file) 
{ 
    $file_name = $fieldNameInTheForm .$file['name']; 
    $file_size =$file['size']; 
    $file_tmp =$file['tmp_name']; 
    $file_type=$file['type']; 
    $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" . date("Ymd_his") . "_" . $file_name; 
    //echo $new_file; 
    move_uploaded_file($file_tmp,$new_file); 
} 
0

를 입력 필드가 있어야한다 :

<input type="file" id="scanned_permit_renewal" name="scanned_permit_renewal[]" multiple="multiple"> 

처리 부분 :

if (count($_FILES["scanned_permit_renewal"]["name"]) > 0) { 
foreach($_FILES['scanned_permit_renewal']['tmp_name'] as $key => $tmp_name) 
{ 
    $file_name = $key.$_FILES['scanned_permit_renewal']['name'][$key]; 
    $file_size =$_FILES['scanned_permit_renewal']['size'][$key]; 
    $file_tmp =$_FILES['scanned_permit_renewal']['tmp_name'][$key]; 
    $file_type=$_FILES['scanned_permit_renewal']['type'][$key]; 
    $file_to_save = date("Ymd_his") . "_" . $file_name; 
    $new_file = $_SERVER['DOCUMENT_ROOT'] . "/uploads/" .$file_to_save; 
    //echo $new_file; 
    if(move_uploaded_file($file_tmp,$new_file)){ 
     // update database 

     $query = "UPDATE `table` SET `field_name` = '".$file_to_save."' WHERE ..... "; 
    } 
} 
} 
+0

이것은 나를위한 이상적인 방법이 될 것입니다. 여기서 유일한 관심사는 테이블의 특정 열, 검사 허가를위한 열 하나, 신원 확인 문서 등등과 같은 파일 이름을 쓰고 싶다는 것입니다. 데이터베이스에서 특정 파일을 가져 와서 표시하기위한 참조. –

관련 문제