2011-11-11 2 views
0

사용자가 원하는만큼 많은 이미지를 업로드하고 양식의 제목을 기반으로 새로운 디렉토리에 모두 넣은 다음 해당 폴더 이름을 데이터베이스에 기록하고 나는 이미지 덤프를하기 위해 나중에 호출 할 것이다. 여러 파일 업로드 php 및 mysql

그래서 지금은 여러 일에 대해이 작업되었으며,

<form method='post' enctype='multipart/form-data' action='#'> 
<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td width="40%" class="right"> 

Title: </td><td width="60%" class="left"><input type="text" autofocus autofocus="autofocus" required required="required" name="ttitle" maxlength="255" 
    /> 
*</td></tr><tr><td class="right"> 
Subtitle:</td><td class="left"> <input type="text" required required="required" name="tsub" maxlength="255" 
    /> 
*</td></tr><tr><td class="right"> 
Username: </td><td class="left"><input type="text" required required="required" name="username" maxlength="255" 
    /> 
*</td></tr><tr><td class="right"> 
Password: </td><td class="left"><input type="password" required required="required" name="pass" maxlength="255" 
    /> 
*</td></tr> 
<tr><td class="right"> 
Confirm Password: </td><td class="left"><input type="password" required required="required" name="pass2" maxlength="255" 
    /> 
*</td></tr><tr><td class="right">Proposed Director 
</td><td class="left"><input type="text" name="dir" maxlength="255" 
    /> 
    *</td></tr><tr><td class="right">Proposed Additional 
</td><td class="left"><input type="text" name="add" maxlength="255" 
    /></td></tr><tr><td class="right" valign="top"> 
Text: </td><td class="left" valign="top"><textarea required required="required" name="text"></textarea> 
*</td></tr><tr><td class="right"> 
Bobblehead: </td><td class="left"> 
<input type="file" required required="required" name="image[]" multiple=""> 
*</td></tr> </table> 

이제 모든 것이 실제로 복사를 제외하고 작동이 훨씬

if(isset($_POST['Submit'])) 
{ $ttitle = $_POST['ttitle']; 

    $file_dir = './../img/treatments/'; 
    foreach($_FILES as $file_name => $file_array){ 
    $current_image=$_FILES['image']['name'][0]; 
    $extension = substr(strrchr($current_image, '.'), 1); 
if (($extension!= "png") && ($extension != "jpg")) 
{ 
die('Unknown extension'); 
} 
$time = date("fYhis"); 
$new_image = $time . "." . $extension; 
$new_dir = mkdir("./../img/treatments/" . $ttitle, 0700); 
$destination= $new_dir && $new_image; 
$action = copy($_FILES['image']['tmp_name'], $destination); 
    } 

    $last_name = $_POST['last_name']; 
    $username = $_POST['username']; 
    $pass = $_POST['pass']; 
    $text = $_POST['text']; 
    $bio = $_POST['bio']; 
    $tsub = $_POST['tsub']; 
    $image = $ttitle; 
if (!$action) 
{ 
die('File copy failed'); 
}else{ 
echo "File copy successful"; 
} 

다음 HTML 양식을 입수했습니다 그리고 새로운 디렉토리에 파일을 쓰고, 나는 여기에 앉아있다. 그러나 나는 정말로 가까이에있는 것처럼 느껴진다. 그리고 아마 내가 열쇠를 가지고있는 누군가, 나는 단지 나의 머리의 꼭대기에서 그것을 이해할 수 없다. 어떤 도움이라도 좋을 것입니다.

+0

HTML 코드를 적절한 형식으로 지정하십시오. 현재 html 코드가 반복 속성으로 사용됩니다. –

+0

글쎄, 내게 '$ destination'과 관련이 있다는 것을 알고있다. $ new_dir을 가져 와서 $ new_img와 결합하는 방법을 모르므로'url/folder/image.jpg'가 될 것이다. –

+0

I 요구를하고 있었고 = "필요한"둘 모두를 기억하지 못하기 때문에 필요합니다. 그러나 그것들 중 하나는 파이어 폭스와 다른 것에서 작동하도록 필요합니다. –

답변

3

의 내가 코드가 얼마나 미친 듯이 무서운에 나열 할 수 있습니다 얼마나 많은 방법을 보자 : 당신은 당신의 서버에 디렉토리를 생성하기 위해 원시 POST를 사용하고

  1. . 경로 문자에 대해이 게시 필드를 필터링하지 않으므로 원격 사용자가 서버에서 원하는 위치에 디렉토리를 만들 수 있습니다.
  2. 파일 유형을 결정하기 위해 파일 유형을 분석하고 있습니다. $ _FILES 배열에있는 name 매개 변수가 사용자에게 제공되는 파일 이름 인 것을 무시하면 하위 문자열 작업을 사용하여 파일 확장명을 가져오고이를 수행하는 pathinfo() 함수는 무시합니다. 파일 이름으로 돌아가서 악의적 인 사용자가 "nastyvirus.exe"를 "kittens.jpg"로 바꾸고 서버에 업로드하는 것을 막을 수는 없습니다.
  3. 업로드 성공 여부에 대해/모양/양식 검사를하지 않아도됩니다. 모든 것이 완벽하게 작동한다고 가정하고 업로드 된 파일을 처리하는 것을 시작합니다. 업로드가 성공하려면 정확히 한 가지 방법이 있으며 오류가 발생하는 데 수조 가지 방법이 있습니다. 오류 검사가 필요합니다. 그 때문에 _FILES 배열의 매개 변수가 존재합니다.
  4. 파일을 저장하기 위해 원래 파일 이름을 사용하고 있지 않지만, 맹목적으로 새 파일 이름을 생성 한 다음 이전에 업로드 한 파일을 덮어 쓸지 확인하지 않습니다. 두 명의 서로 다른 사용자가 동일한 제목을 선택하고 동시에 두 개의 다른 파일을 업로드 할 가능성이 있습니다. 그러면 스크립트가 해당 파일 중 하나를 다른 파일로 덮어 쓸 것입니다.
  5. 업로드 후 파일을 이동하는 데 copy()을 사용하고 있습니다. 이것은 나쁜 생각입니다. 그 목적을 위해 move_uploaded_file()이 있습니다. 명백한 MOVE 작업 외에도 업로드 완료와 스크립트 처리 사이의 시간에 서버에서 파일이 변조되지 않았는지 확인하기 위해 몇 가지 추가 보안 검사가 있습니다. copy는 문자 그대로 파일을 복사하여 서버의 데이터를 두 배로 (단시간에) 낭비하게하므로 공간이 낭비됩니다. 그리고 대용량 파일의 경우 복사 작업이 꽤 오래 걸릴 것입니다. 파일 시스템 내에서의 움직임은 거의 동시에 비교됩니다.

  6. 여러 파일을 올릴 수 있도록 허용하고 있지만 스크립트는 첫 번째 파일 만 확인합니다 ([0]). 여러 파일을 처리하려면 루프에서이 코드를 수행해야합니다 (예 : foreach(array_keys($_FILES['image']['name']) as $i) { ... }) [0] 대신 [$i]을 사용하십시오.

  7. 너머에는 HTML에 requiredrequired="required"이 있는데, 단순히 공간 낭비 일뿐입니다. 둘 중 하나만 사용하십시오.
  8. $new_dir && $new_file이 있습니다. &&은 PHP의 연결 연산자가 아니며 부울 AND 연산자입니다. $destination에 문자열을 할당하지 않으면 해당 부울의 결과가 저장됩니다. true 또는 false.
+0

모든 조언을 주신 덕분에 와우 덕분에 –

+0

사실을 알고 솔직히 말해서 나는 원래 프로그래머가 아닙니다. 문자 그대로 아무것도 작동하지 않았기 때문에 나는 하루 전에 이것을 가져갔습니다. 모든것을 고치고, 모든 곳에서 theres $ sql 오류가 발생합니다. –

+0

Ok 감사합니다. 이제이 코드를 4 학년처럼 보이지 않게 할 것입니다. –

1

각 업로드 된 파일에 대해 반복해야하고 copy/move_uploaded_file입니다. 그러면 파일 $_FILES['image']['tmp_name'][0]에 액세스하는 방법입니다. move_uploaded_file이 가장 적합합니다.