2013-04-11 1 views
0

C++ 프로그램을 대체하는 웹 응용 프로그램을 작성하고 있습니다. 응용 프로그램의 목적은 브라우저에서 사진을 추가하거나 가져 와서 서버에 업로드하는 것입니다.Ajax : 실제 파일없이 파일 정보 보내기

파일 업로드에는 파일이 서버에 이미 있는지 확인하고 그렇지 않은 경우 파일을 업로드하는 두 가지 주요 단계가 있습니다.

Ajax에서 첫 번째 기본 단계를 수행 할 수 있는지 궁금합니다 (PHP 스크립트는 실제 파일 내용없이 $ _FILES를 사용하고 있습니다).

는 C++ 코드는 다음과 같습니다 : 만 원하는 반면,

var form = new FormData(); 
form.append("expected_size", expected_size); 
form.append("original_size", original_size); 
form.append("mode", "check_file"); 
form.append("file", fileInput.files[0]); 

var xhr = new XMLHttpRequest(); 
xhr.open('POST', action, true); 
xhr.send(formData); 

이 스크립트는 실제 파일과 파일 정보를 보냅니다

*dataBuffer_ += QByteArray("--") + QByteArray(MULTIPART_BOUNDARY) + QByteArray("\r\n"); 
*dataBuffer_ += QByteArray("content-disposition: form-data; name=\"expected_size\"\r\n\r\n"); 
*dataBuffer_ += fileSize.toAscii() + QByteArray("\r\n"); 

//original size 
//Original size of the file before compression and encoding 
*dataBuffer_ += QByteArray("--") + QByteArray(MULTIPART_BOUNDARY) + QByteArray("\r\n"); 
*dataBuffer_ += QByteArray("content-disposition: form-data; name=\"original_size\"\r\n\r\n"); 
*dataBuffer_ += QString::number(file.size()).toAscii() + QByteArray("\r\n"); 

//tell upload.php that we have a file to upload 
*dataBuffer_ += QByteArray("--") + QByteArray(MULTIPART_BOUNDARY) + QByteArray("\r\n"); 
*dataBuffer_ += QByteArray("content-disposition: form-data; name=\"mode\"\r\n\r\n"); 
*dataBuffer_ += QByteArray("check_file\r\n"); 

//the binary 
*dataBuffer_ += QByteArray("--") + QByteArray(MULTIPART_BOUNDARY) + QByteArray("\r\n"); 
*dataBuffer_ += QByteArray("content-disposition: form-data; name=\"file\"; filename=\"") + file.fileName().toAscii() + QByteArray("\"\r\n"); 
*dataBuffer_ += QByteArray("content-type: application/zip\r\n\r\n"); 
*dataBuffer_ += fileBuffer; 
*dataBuffer_ += QByteArray("\r\n"); 

*dataBuffer_ += QByteArray("--") + QByteArray(MULTIPART_BOUNDARY) + QByteArray("--"); 

내가 같은 것을 할 싶습니다 파일 정보를 보냅니다. 아무도 내가 어떻게이 일을 할 수 있는지 아니? 여기

는 PHP 스크립트 (I 수정할 수없는)입니다 :

//check if the file was already uploaded to the server (for resuming an upload) 
//returns file:exist or file:not_exist 
//the post is the same as when transmitting a file, except the data block 
if ('check_file' == $_POST['mode']) 
{ 
    echo "CHECK FILE\n"; 
    if (!file_exists($_SESSION['localdir'])) 
    { 
    echo "upload:fail\n"; 
    echo "message:Unable to copy data on server\n"; 
    exit(); 
    } 

    if (empty($_FILES)) 
    { 
    echo "upload:fail\n"; 
    echo "message:No files were uploaded to the server\n"; 
    exit(); 
    } 

    $file = $_FILES['file']; 
    $path = $_SESSION['localdir'] . "/" . $file['name']; 

    if (file_exists($path)) 
    { 
     echo $file['name'] . " already exists on the server \n"; 
     echo "Server file size: " . filesize($path) . "\n"; 
     echo "Uploaded file size: " . $_POST['original_size'] . " \n"; 

     if (filesize($path) == $_POST['original_size']) 
     { 
      echo "file:exist\n"; 

      //add the file to the global list if it is not already there 
      if (!array_search($file['name'], $_SESSION['filenames'], true)) //true=strict 
       array_push($_SESSION['filenames'], $file['name']); 
     } 
     else 
      echo "file:not_exist\n"; 
    } 


} 
+0

파일 이름과 파일 크기에만 관심이 있다면'files [0] .name'과'files [0] .size'를 서버에 보낼 수 있습니다. – Passerby

+0

form.append ("file", fileInput.files [0] .name)와 같은 뜻입니까? 나는 그것이 가능하다는 것을 몰랐다! 고마워, 나는 그것을 시도 할 것이다 :). –

+0

주의,'files [0] .name'은 ** 문자열 **,'files [0] .size'는 ** 정수 **입니다. ('$ _FILES'가 없으므로)이 변경 사항을 충족 시키려면 서버 측 코드를 수정해야합니다. – Passerby

답변

0

내가 수동으로 헤더를 설정하여 그것을 한 적이합니다 (C와 같은 ++ 위의 코드), 내 AJAX :

var boundary = generateBoundary(); 

var databuffer = "\r\n"; 
// set original_size 
databuffer += "--" + boundary + "\r\n"; 
databuffer += "content-disposition: form-data; name=\"original_size\"\r\n\r\n"; 
databuffer += allFiles[index].size + "\r\n"; 
// set mode 
databuffer += "--" + boundary + "\r\n"; 
databuffer += "content-disposition: form-data; name=\"mode\"\r\n\r\n"; 
databuffer += "check_file\r\n"; 
// set the file 
databuffer += "--" + boundary + "\r\n"; 
databuffer += "content-disposition: form-data; name=\"file\"; filename=\"" + allFiles[index].name + "\"\r\n"; 
databuffer += "content-type: application/zip\r\n\r\n"; 
databuffer += ""; // this is de file content => empty 
databuffer += "\r\n"; 
// end 
databuffer += "--" + boundary + "--"; 

실제 파일 내용없이 필요한 정보가 포함 된 파일을 보냅니다. 다른 사람들에게 도움이되기를 바랍니다.

관련 문제