2012-07-23 6 views
0

저는 PHP로 매우 새롭기 때문에 (많은 HTML 경험이 없어도) 질문이 있습니다. 나는 두 개의 PHP 스크립트 (아래 참조)로 구성된 파일 업로드 시스템을 가지고있다. 파일 업로드 양식에서 사용자는 파일을 선택하고 폴더를 저장 한 다음 업로드합니다. 저장 위치는 업로드 디렉토리의 폴더로 구성된 드롭 다운 메뉴에서 선택할 수 있습니다. 하지만 드롭 다운 메뉴에는 다른 옵션이 있습니다. 사용자가 other 옵션을 선택하면 JavaScript로 완료된 새 필드가 나타나고 사용자는 수동으로 위치를 삽입 할 수 있습니다 (예 : 디렉토리가없고 사용자가 새 디렉토리를 만들려고하는 경우).PHP/HTML 업로드 스크립트가 제대로 작동하지 않습니다.

그러나 여기에 문제가 있습니다. 사용자가 미리 정의 된 폴더를 선택하면 모든 항목이 정상적으로 작동하지만 사용자가 필드에 디렉토리 이름을 쓰면 folder이라는 폴더 만 생성됩니다. 예를 들어 사용자가 꽃에 대한 그림을 업로드하려고하고 flower이라는 폴더가없는 경우 사용자는 other을 선택하고 flower을 상자에 씁니다. 그런 다음 업로드 버튼을 클릭하면 기본적으로 PHP는 flower이라는 새 폴더를 만들고 거기에 그림을 업로드해야합니다. 그러나 현재 PHP는 folder이라는 폴더를 만듭니다. 그리고 어떤 이유로 그곳에 사진이 업로드되지 않습니다 (아무데도 업로드되지 않았습니다). 스크립트와

내 문제 : 새로운 폴더가 생성되지 않습니다

  1. . 나는 그것이 "폴더"라는 두 가지 값을 갖고 있기 때문에 생각합니다. 그러나 "다른 것"이 선택되면 PHP는 마지막 값만 보입니다.
  2. 폴더가 만들어 지더라도 파일이 어떤 이유로 업로드되지 않습니다.

누구든지 내 문제에 대한 해결책을 찾고 해결할 수 있으면 정말 감사 할 것입니다. 그리고 영어가 최선이 아니기 때문에 추가 정보를 요청하는 것을 주저하지 마십시오.이 때문에 어떤 것을 이해할 수 없습니다.

미리 감사드립니다.

1 파일 : file-upload.php :

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title></title> 
<script language="JavaScript" type="text/javascript"> 
<!-- 

function Toggle(obj){ 
var val=obj.value; 
if (!obj.m){ obj.m=''; } 
if (!obj.m.match(val)){ obj.m+=','+val+','; } 
var hide=obj.m.split(','); 
for (var zxc0=0;zxc0<hide.length;zxc0++){ 
if (document.getElementById(hide[zxc0])){ 
document.getElementById(hide[zxc0]).style.display='none'; 
} 
} 
var show=val.split(','); 
for (var zxc1=0;zxc1<show.length;zxc1++){ 
if (document.getElementById(show[zxc1])){ 
document.getElementById(show[zxc1]).style.display=''; 
} 
} 
} 

//--> 
</script> 
</head> 
<body> 
<h1>Upload</h1> 
<form action="upload.php" method="post" 
enctype="multipart/form-data"><br> 
<label for="file">File:</label> 
<input type="file" name="file" id="file" /> 
    <br> 
    Tüüp: <select name="folder" value="folder" onchange="Toggle(this);"> 
<?php 
foreach(glob('/uploadfolder/*',  GLOB_ONLYDIR) as $dir) 
{ 
    $dir = basename($dir); 
    echo '<option value="', $dir, '">', $dir, '</option>'; 
} 
?> 
<option value="folder">other</option> 
     </select><br> 

<input id="folder" value="Create a new folder" style="display:none;"> 
<input type="submit" name="submit" value="Upload" /> 
</form> 
</body> 
</html> 

2 파일 : upload.php :

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title></title> 
</head> 
<body> 
<h1>Upload</h1> 
<br> 

<?php 
$dirname = $folder = $_POST["folder"]; 
$filename = "/uploadfolder/" . "$dirname" . "/"; 

if (!file_exists($filename)) { 
    mkdir("/uploadfolder/" . "$dirname", 0777); 
} 

if ((($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/pjpeg") 
|| ($_FILES["file"]["type"] == "application/vnd.openxmlformats-  officedocument.spreadsheetml.sheet")) 
&& ($_FILES["file"]["size"] < 5120000)) 
    { 
    if ($_FILES["file"]["error"] > 0) 
    { 
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
    } 
    else 
    { 
    echo "Name: " . $_FILES["file"]["name"] . "<br />"; 
    echo "Type: " . $_FILES["file"]["type"] . "<br />"; 
    echo "Size: " . ($_FILES["file"]["size"]/1024) . " Kb<br />"; 
    echo "Tmp. file: " . $_FILES["file"]["tmp_name"] . "<br />"; 
    echo "Folder: " . $folder . "<br />"; 

    if (file_exists("/uploadfolder/$folder/" . $_FILES["file"]["name"])) 
     { 
     echo $_FILES["file"]["name"] . " already exists. "; 
     } 
    else 
     { 
     move_uploaded_file($_FILES["file"]["tmp_name"], 
     "/uploadfolder/$folder/" . $_FILES["file"]["name"]); 
     echo "Saved: " . "" . $_FILES["file"]["name"]; 
     } 
    } 
    } 
else 
    { 
    echo "Upload failed"; 
    } 
?> 
</body> 
</html> 
현재 PHP에서

답변

0

는 파일 먼저 upload.php에서 다음 단계

를 수행 새 폴더 이름 텍스트 필드에 이름 속성을 추가 할 수 있습니다. ,

<input id="folder" value="Create a new folder" name="newfolder" style="display:none;"> 

는 이제 upload.php로 파일에 다음과 같이 변경, 그것은이처럼 밖으로 통해 폴더 이름으로
$dirname = $_POST["folder"]; 
$filename = ("./uploadfolder/" . "$dirname" . "/"); 
if($dirname=="folder"){$dirname=$_POST["newfolder"];} 
if (!file_exists($filename)) { 
    mkdir("./uploadfolder/" . "$dirname", 0777); 
} 

사용 $dirname하자. 따라서 $folder$dirname으로 대체하십시오.

또 다른 것은 업로드가 여전히 정상적으로 작동하지 않으면 기본 경로로 "./uploadfolder/$folder/"을 사용하는 것입니다. 또한 작업 공간에 777 권한을 부여하십시오. 당신은 다음 명령, 다른 SOF 사용자들에 의해 언급 한 바와 같이

chmod -R 777 <path_to_uploadfolder> 

을 사용하여 파일에서 exit;을 제거 할 수 있습니다하면 처음에 확인 존재한다.

당신은 답을 갖고 있기를 바랍니다. :)

+0

감사합니다. 귀하의 게시물 정말 도움이되었다, 내 대본이 거의 작동합니다. 그러나 여전히 한 가지 문제가 있습니다. 이미 목적지로 존재하는 폴더를 선택하면 모든 것이 정상적으로 파일이 해당 폴더에 업로드되지만, 드롭 다운 메뉴에서 "기타"를 선택한 다음 "travel"과 같이 수동으로 폴더 이름을 삽입하면 클릭합니다. "업로드", "폴더"라는 폴더가 생성됩니다. 어떤 이유로 수동으로 삽입 된 폴더 이름이 PHP에 의해 처리되지 않습니다. 무슨 문제인지 아십니까? – SomeOne

+0

안녕하세요 mihkel93, 문제는 실제로 "기타"에 대한

+0

확인. 고맙습니다!! – SomeOne

0

는 "폴더"어떤 이유로 사진도되지 않습니다라는 폴더를 만든다 업로드 됨

두 번째 파일에서 발췌 한 다음에 exit;을했습니다 :

결과
<?php 
$dirname = $_POST["folder"]; 
$filename = ("/uploadfolder/" . "$dirname" . "/"); 

if (!file_exists($filename)) { 
    mkdir("/uploadfolder/" . "$dirname", 0777); 
    exit; 
} else { 
} 
?> 

이 스크립트는 즉시 폴더가 생성 될 때 종료됩니다.

은 스크립트로 여러 보안 문제가 있습니다 그러나 이것은 보안 교훈 :

+0

감사합니다. 그래, 나는 그것이 최고의 스크립트가 아니며 많은 보안 문제가 있다는 것을 알고 있지만 스크립트는 현재 나에게만 사용되고 아파치 암호로 보호된다. – SomeOne

0

스크립트가 실행을 중지시킬 것 mkdir 후 라인 exit을위한 장소가 아니기 때문에 나는 그들에 점점 귀찮게하지 않습니다. 폴더를 만들고 파일 업로드를 계속하려면 exit 문을 제거해야합니다. 비어 있기 때문에 그 부분의 else 부분을 삭제할 수도 있습니다 ...

$dirname = $folder = $_POST["folder"]; 
$filename = "/uploadfolder/" . "$dirname" . "/"; 

if (!file_exists($filename)) { 
    mkdir("/uploadfolder/" . "$dirname", 0777); 
} 

if ((($_FILES["file"]["type"] == "image/gif") 
... 
+0

감사합니다. 그러나 스크립트가 올바르게 작동하지 않습니다. – SomeOne

관련 문제