2014-06-18 3 views
0

그래, 전체적으로및 CakePHP 양식을 사용하여 아약스를 통해 단일 파일을 업로드하려고합니다. 문제는 컨트롤러에서 $this->request->data을 로깅하는 오류로 데이터를 잡으려고하면 빈 파일 배열을 반환한다는 것입니다.FormData, AJax 및 CakePHP를 사용하여 파일 업로드

그래서 CakePHP의 도우미를 사용하여 양식을 설정했습니다. 그러나 그 구조는 그다지 관련이 없습니다. 사용 된 자바 스크립트는 필요한 디버깅을 출력합니다.

여기는 설정입니다. RequestsController라는 컨트롤러가 있고 내 뷰 이름/기능은 upload_files입니다.

자바 스크립트 코드 조각은 다음과 같습니다. 주의 사항이이 파일 입력 요소 값이 변경 (그들은 업로드 할 파일을 즉를 선택한 후) 때 호출되는

plugin.fileUpload = function(el) 
    { 
     el = $(el); 

     form = el.closest('form'); 

     var files = el.get(0).files; 

     console.log(files.length) 

     var formData = new FormData(); 

     for (var i = 0; i < files.length; i++) 
     { 
      var file = files[i]; 

      console.log(file); 

      formData.append('files[]', file, file.name); 
     } 

     formData.append("username", "[email protected]"); 

     var xhr = new XMLHttpRequest(); 

     xhr.open('POST', form.attr('action'), true); 

     xhr.onload = function() { 
      if (xhr.status === 200) { 
       toastr.success('Successfully loaded'); 
      } 
      else 
      { 
       alert('An error occurred!'); 
      } 
     }; 

     xhr.send(formData); 

     console.log(files); 
     console.log(formData); 
    } 

변명 모든 콘솔 로그. 그것은 출력과 디버깅을 보여주는 목적을위한 것입니다.

사용자 입력란을 추가하면 컨트롤러가 일부 데이터를 그대로두고 게시물을 만들고 있음을 테스트 할 수 있습니다. 그것은 정말로입니다. 당신이 볼 수 있듯이,

2014-06-18 17:51:41 Error: RequestsController::upload_files - Line 45 
2014-06-18 17:51:41 Error: Array 
(
    [username] => [email protected] 
) 

사용자 이름 필드는 파일을 통해하지만 간다 : 여기에 $this->request->data 배열을 로그의 출력입니다.

JS 변수를 콘솔에 기록 했으므로 멋지게 보입니다. 방화범은 다음과 같습니다

FormData { append=append()} 

한숨의 FormData 출력에 아무것도 파일이 FormData에 그것을 만드는 것을 제안하지 :

FileList { 0=File, length=1, item=item(), more...} 

는 콘솔에 FormData 변수는 다음과 같이 보이는 로깅 목적.

어떤 아이디어 ??

답변

0

아이 컨트롤러에 FormData 통해 업로드 파일에 액세스 명확한 잡았다

되었다 어느 양식 제출 어떤 PHP 스크립트 파일에 액세스하는 것과 같다.

나는이 파일을 조작하기 위해 정상적인 $ _FILES 변수를 사용하여 파일에 액세스해야했습니다.

그래서, 내 컨트롤러에 로그인하는 것은 지금과 같이 보입니다 :

function upload_files() 
{ 
    if($this->request->is('post')) 
    { 
     CakeLog::write('error', print_r($_FILES, true)); 
    } 
} 

을 그리고 우리는 다음과 같이 파일의 좋은, 건강한 찾고 배열을 얻을 :

2014-06-18 22:13:29 Error: Array 
(
    [files] => Array 
     (
      [name] => ReadMe.txt 
      [type] => text/plain 
      [tmp_name] => /tmp/phpOUTn8l 
      [error] => 0 
      [size] => 3627 
     ) 

) 
관련 문제