>source

기본 html 형식인 index.php를 사용하여 request.php에 대한 PHP POST 요청을 만드는 간단한 프로그램을 만들고 있습니다. 목적은 입력 필드가 비어 있지 않은지, jpg/jpeg 파일이 업로드되었는지, 파일 크기가 2MB 미만인지 확인하는 것입니다. 이러한 검사를 성공적으로 완료하면 파일을 임시 위치에서 upload/디렉토리로 이동하고 고유한 파일 이름을 지정하고 사용자 이름, 이름, 성 및 profile_picture의 간단한 HTML 페이지를 표시합니다.

내 code가 거의 완성된 것 같지만 요구 사항의 이름 변경 부분을 파악하지 못했고 index.php에서 제출을 클릭하면 500 오류가 발생합니다. 누군가가 내 작업을 확인하기 위해 그들의 눈을 빌려줄 수 있다면 그것은 크게 감사할 것입니다!

여기까지 내 code는 다음과 같습니다.

index.php:

<!DOCTYPE html><h1>My First PHP POST Request</h1><form action="results.php" enctype="multipart/form-data" action="__URL__" method="post">  Username: <input type="text" name="user">  Password: <input type="text" name="pwd"><br><br>  First Name: <input type="text" name="fName">  Last Name: <input type="text" name="lName"><br><br>  Select image to upload: <input name="profile_picture" type="file">  <br>  <br>  <input type="submit" name="submit"></form>

요청.php:

<!DOCTYPE html><head>  <style>  </style></head><br><br><?php
$user= $_POST['user'];
$pwd= $_POST['pwd'];
$fName= $_POST['fName'];
$lName= $_POST['lName'];
$maxsize= "2097152";   /* 2MB in Bytes */
$allowedext=  array('jpeg', 'jpg');
$target_dir= "uploads/";
$target_file= $target_dir . basename($_FILES["profile_picture"]["name"]);
if (empty($user)) {
  $fehler .= "

&amp; bull; no username given!

" ; } if (empty($pwd)) { $error .= "

&amp; bull; no password given!

" ; } if (empty($fName)) { $error .= "

&amp; bull; no first name given!

" ; } if (empty($lName)) { $error .= "

&amp; bull; no last name given!

" ; } if (empty($error)) { if (!in_array(filetype($profile_picture), $allowedext) { /* check filetype */ $error .= "

&amp; bull; filetype is not allowed

" ; } if (empty($error)) { if (filesize($profile_picture) > $maxsize) { /* check filesize */ $error .= "

&amp; bull; file is too big

" ; } if (empty($error)) { if (move_uploaded_file($_FILES["profile_picture"]["tmp_name"], $target_file)) { ?> Username: <?php echo $_POST["user"]; ?><br> Password: <?php echo $_POST["pwd"]; ?><br> First Name: <?php echo $_POST["fName"]; ?><br> Last Name: <?php echo $_POST["lName"]; ?><br><br> Uploaded Image: <img src="<?php echo $_FILES["profile_picture"]; ?>" /> <? echo "The file ". htmlspecialchars( basename( $_FILES["profile_picture"]["name"])). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } } else { echo($error); } } } ?>

request.php 대신 양식에서 results.php를 호출하고 있습니다.

Shlomtzion2022-01-28 15:09:13

@Shlomtzion이 게시물을 작성한 내 실수. 내 로컬 컴퓨터의 파일 이름이 올바르게 지정되었습니다. 여전히 문제가 있음

jgaud2022-01-28 15:09:13

두 번 양식에 작업이 있습니다. action="results.php" 및 action="__URL__". 두 번째를 제거합니다.

Kevin Y2022-01-28 15:09:13

@KevinY 이 작업을 수행했지만 여전히 동일한 문제입니다. html 랜더링 빼고 다 없애려고 했더니 업로드한 이미지도 안 뜨네요.

jgaud2022-01-28 15:09:13

짧은 태그 Kevin Y2022-01-28 15:09:13

  • 답변 # 1

    참조 https://www.tutorialspoint.com/php/php_file_uploading.htm

    제안 사항:
    code 상단 부근:

    $profile_picture= $_FILES["profile_picture"];
    

    변수를 더 설정합니다.

    $profile_picture= $_FILES["profile_picture"];
    $file_name= $profile_picture['name'];
    $file_ext= strtolower(end(explode('.',$file_name)));
    $file_size= $profile_picture['size'];
    //prevent against filenames containing ../../etc
    $file_name_safe= basename($profile_picture['name']);
    $file_tmp= $profile_picture['tmp_name'];
    $destination= "../uploads/$file_name_safe";
    

    그런 다음 code에서:

    1. ext를 확인하는 대신파일 형식($profile_picture)사용$file_ext
    2. 파일 크기를 확인하는 대신파일 크기($profile_picture)사용$file_size
    3. 대신move_uploaded_file($_FILES["profile_picture"]["tmp_name"], "../uploads/")사용move_uploaded_file($file_tmp, $destination)

    그런 다음 변경:

    <?php echo "<img src='" . {$profile_picture} . "'/>;" ?>

    파일이 업로드될 위치:

    <img src="../uploads/<?= htmlentities($file_name_safe) ?>" />

    보안 강화를 위해 대상 파일 이름을 스크램블링할 수도 있습니다. 악용으로 인해 업로드에 대한 가정이 적을수록 좋습니다.

    jp(e)gs만 사용하고 있으므로 보안을 강화하기 위해 다음과 같이 시도할 수 있습니다.

    $file_name_safe= bin2hex(random_bytes(30)) . '.jpg';
    

  • 이전 python : Django-error OSError: dlopen()이 라이브러리를 로드하지 못했습니다: cairo /cairo-2 /cairo-gobject-2
  • 다음 .net : 처리되지 않은 예외가 AppDomain.UnhandledException에 의해 catch되지 않음