5

同様の質問がたくさんあることは知っていますが、まだ問題の解決策を見つけていません。XMLHttpRequest でファイルをアップロードしようとしているので、以下のコードを開発しました。

var sendFiles = function(url,onload,onerror,file,headers){
    var xhr = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHttp'),
    upload = xhr.upload;
    API.addEvent(xhr,'readystatechange',function(){
        if(xhr.readyState==4)
            if((xhr.status>=200 && xhr.status<300) || xhr.status==304){
                this.response = this.response || this.responseText;
                onload.call(xhr);
            }else onerror.call(xhr);
    });
    xhr.open('POST',url,true);
    for(var n=0;n<headers.length;n++)
        xhr.setRequestHeader(headers[n]);
    xhr.send(file);
    return xhr;
};

PHP 側のスクリプトは次のとおりです。

<?php
header('Content-type: text/html;charset=ISO-8859-1');
$status = 0;
if(@copy($_FILES['file']['tmp_name'],'test\\' . $_FILES['file']['name']))
    $status = 1;
else
    $err = '0';
echo '{
    "status": ' . $status . '
}';
?>;

しかし、var $_FILES['file'] は空のようです。これは、ファイルがサーバーに送信されていないことを意味します。次に、以下のコードで FormData オブジェクトを使用することにしました

var sendFiles = function(url,onload,onerror,file,headers){
    var xhr = XMLHttpRequest ? new XMLHttpRequest() : new    ActiveXObject('Microsoft.XMLHttp'),
    upload = xhr.upload,
    formData = new FormData();
    formData.append('file',file);
    API.addEvent(xhr,'readystatechange',function(){
        if(xhr.readyState==4)
            if((xhr.status>=200 && xhr.status<300) || xhr.status==304){
                this.response = this.response || this.responseText;
                onload.call(xhr);
            }else onerror.call(xhr);
    });
    xhr.open('POST',url,true);
    for(var n=0;n<headers.length;n++)
        xhr.setRequestHeader(headers[n]);
    xhr.send(formData);
    return xhr;
};

そして、それは機能しましたが、ファイルサイズが約8MBまでしかありませんでした. サイズが 8 MB を超えるファイルを送信しようとすると、var$_FILES['file']が再び空になります

。注: 'file' var は、document.getElementsById('fileInput').files[0];

4

3 に答える 3

17

post_max_size 制限の問題を回避するには...両側でメモリ不足の問題も回避するには:

クライアント側

  • POST の代わりに PUT を使用します。

    xhr.open("put", "upload.php", true);

  • 元の FileName と FileSize を指定するカスタム ヘッダーを追加します。

    xhr.setRequestHeader("X-File-Name", file.name);
    xhr.setRequestHeader("X-File-Size", file.size);

  • XHR send メソッドで File オブジェクトを直接使用します。

    xhr.send(file);

    File オブジェクトは、input[type=file] DOM オブジェクトの「files」プロパティを介して直接取得できることに注意してください。

サーバー側

  • $_SERVER 経由でカスタム ヘッダーを読み取ります。

    $filename = $_SERVER['HTTP_X_FILE_NAME'];
    $filesize = $_SERVER['HTTP_X_FILE_SIZE'];

  • php://input を使用してファイル データを読み取ります。

    $in = fopen('php://input','r');

これにより、非常に大きなファイル (1GB 以上) を無制限に送信できます!!!

このコードは、FireFox 4 以降、Chrome 6 以降、IE10 以降で機能します。

于 2012-08-02T06:02:13.893 に答える
3

post_max_sizeini ファイルのディレクティブを変更します

于 2012-05-10T23:58:36.760 に答える
1

Ajax 呼び出しはサイズを制限しません。おそらくphp iniファイルの最大ファイルサイズです。

于 2012-05-07T00:12:05.947 に答える