0

C++ プログラムを置き換える Web アプリケーションを作成しています。アプリケーションの目的は、ブラウザから写真を追加または撮影して、それをサーバーにアップロードすることです。

ファイルのアップロードには、ファイルがサーバーに既に存在するかどうかを確認し、存在しない場合はファイルをアップロードするという 2 つの主要な手順があります。

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";
    }


 }
4

1 に答える 1

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

これにより、実際のファイル コンテンツなしで、必要な情報を含むファイルが送信されます。これが他の人に役立つことを願っています。

于 2013-04-29T17:51:01.903 に答える