通过XMLHttpRequest将原始数据发送到PHP


Send raw data to PHP via XMLHttpRequest

我正在选择一个文件并通过XMLXttpRequest发送它,如下所示:

var upload_form = $('#upload_form'),
        file_input = $('#file_input'),
        file_list = $('#file_list'),
        submit_btn = $('#submit_btn'),
        uploaders = [];
    file_input.on('change', onFilesSelected);
    upload_form.on('submit', onFormSubmit);

    /**
     * Loops through the selected files, displays their file name and size
     * in the file list, and enables the submit button for uploading.
     */
    function onFilesSelected(e) {
        var files = e.target.files,
            file,
            list_item,
            uploader;
        for (var i = 0; i < files.length; i++) {
            file = files[i];
            uploader = new ChunkedUploader(file);
            uploaders.push(uploader);
            list_item = $('<li>' + file.name + '(' + file.size.formatBytes() + ') <button>Pause</button></li>').data('uploader', uploader);
            file_list.append(list_item);
        }
        file_list.show();
        submit_btn.attr('disabled', false);
    }

因此,对于我添加的每个文件,我都会创建一个new ChunkedUploader对象,该对象将文件分块为小的1MB文件。ChunkedUploader对象的代码如下:

function ChunkedUploader(file, options) {
    if (!this instanceof ChunkedUploader) {
        return new ChunkedUploader(file, options);
    }
    this.file = file;

    this.options = $.extend({
        url: 'index/upload'
    }, options);
    this.file_size = this.file.size;
    this.chunk_size = (1024 * 100); // 100KB
    this.range_start = 0;
    this.range_end = this.chunk_size;
    if ('mozSlice' in this.file) {
        this.slice_method = 'mozSlice';
    }
    else if ('webkitSlice' in this.file) {
        this.slice_method = 'webkitSlice';
    }
    else {
        this.slice_method = 'slice';
    }

    this.upload_request = new XMLHttpRequest();
    this.upload_request.onload = this._onChunkComplete();
}


_upload: function() {
        var self = this,
            chunk;
        // Slight timeout needed here (File read / AJAX readystate conflict?)
        setTimeout(function() {
            // Prevent range overflow
            if (self.range_end > self.file_size) {
                self.range_end = self.file_size;
            }
            chunk = self.file[self.slice_method](self.range_start, self.range_end);
            self.upload_request.open('POST', self.options.url, true);
            self.upload_request.overrideMimeType('application/octet-stream');
            if (self.range_start !== 0) {
                self.upload_request.setRequestHeader('Content-Range', 'bytes ' + self.range_start + '-' + self.range_end + '/' + self.file_size);
            }
            self.upload_request.send(chunk);
        }, 200);
    },

这一切都可以正常工作,但在PHP端,我没有通过$_GET$_POST$_FILE收到任何东西。我可以在Firebug中看到,原始数据是通过post发送的,有一些胡言乱语的数据正在发送,我想这是我刚刚从原始文件中裁剪的小块。我到处找了找,找不到任何与这个案子有关的东西。

你能指出我做错了什么吗,因为我毫无头绪。

您可能需要file_get_contents('php://input'):这是原始请求体,而$_POST已经是一个解析的表示。

请参阅http://php.net/manual/en/wrappers.php.php#wrappers.php.input