2013-04-11 2 views
0

Я пишу веб-приложение, заменяющее программу на C++. Цель приложения - добавлять или делать снимки из браузера, а затем загружать их на сервер.Ajax: отправка информации о файле без фактического файла

Загрузка файла имеет два основных этапа: проверка наличия файла на сервере, а если нет, то загрузка файла.

Мне интересно, как я могу сделать первый основной шаг в Ajax (отправка файла (PHP-скрипт использует $ _FILES, который я не могу изменить) без фактического содержимого файла).

код

C++ выглядит следующим образом:

*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("--"); 

Я хотел бы сделать что-то вроде этого:

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); 

Этот скрипт отправляет информацию о файле с самим файлом, в то время как я только хочу отправьте информацию о файле. Кто-нибудь знает, как я могу это сделать?

Вот PHP скрипт (который я не могу изменить):

//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 + "--"; 

Это отправляет файл с необходимой информацией без фактического содержимого файла. Надеюсь, это поможет другим людям.

Смежные вопросы