2011-05-07 10 views
0

ファイルをバックグラウンドでアップロードしようとしています。私はフレームワークを使用することができないので、私は手動で行う必要があります。ページには既にフォームが含まれており、ファイル入力フィールドはそのフォーム内にあります。フォームにフォームを埋め込むことができないため、ファイル入力を移動する必要があります。JavaScriptを使ってバックグラウンドでファイルを動的にアップロードする

私が使用しているコードの問題は、実際には送信されていないようですが、ネットワークアクティビティはまったく表示されません。誰でもここに間違ったものを見つけられますか?

<form> 
... 
    <input id="photo-file-input" type="file"/> 
    <button type="button" onClick="uploadBackground('photo-file-input');">Upload</button> 
.... 
</form> 

function uploadBackground(fileInputId) 
{ 
    var iframe = createIframe('TEST'); 
    var form = createUploadForm('TEST', 'upload.php'); 
    var fileInput = document.getElementById(fileInputId); 
    var fileInputParent = fileInput.parent; 

    //move file input into generated form 
    form.appendChild(fileInput); 
    form.submit(); 

    iframe.onload = function() 
    { 
     alert('file was uploaded'); 
     //put the file input back where it was 
     fileInputParent.appendChild(fileInput); 

     //clean up generated elements 
     iframe.parent.removeChild(iframe); 
     form.parent.removeChild(form); 
    } 
} 


function createUploadForm(target, action) 
{ 
    var form = document.createElement('form'); 

    form.display = 'none'; 
    form.target = target; 
    form.action = action; 
    form.method = 'POST'; 
    form.enctype = 'multipart/form-data'; 

    return form; 
} 

function createIframe(name) 
{ 
    var iframe; 

    try 
    { 
      iframe = document.createElement('<iframe name="' + name + '">'); 
    } 
    catch (ex) 
    { 
      iframe = document.createElement('iframe'); 
      iframe.name = name; 
    } 

    return iframe; 
} 

答えて

3

ファイル入力要素をコピーしてその値を設定/保持することはできません。セキュリティ上の理由からです。新しいフォームを作成する必要はありません。ページにiframeを追加するだけで、フォームのターゲットをiframe名に設定し、元のフォームを送信します。

1

私は同じ問題を探していると私は思う、私は、FirefoxとChromeのために働くだろうと上記のIE 10と上にあってもよい解決策、(ここで私はいくつかのmorrがテストを必要とする)

解決策を発見しました私はフレームセットを使うので少し醜いです。しかしこれは私が今までに見つけた唯一の解決策です。

使用例: 私たちは製品カタログを持つウェブサイトを持っており、エディタは各製品のビデオをアップロードできます。

動画のアップロードには長い時間がかかるため、動画を選択した後にアップロードを開始し、他の製品に移動して他のファイルをアップロードすることができます最初のダウンロードが完了します。どのように動作する

https://stackoverflow.com/a/1186309/2248340 https://stackoverflow.com/a/105074/2248340

テストは、いくつかの他の作業に基づいています

あなたが提出押すと、あなたがデータを構成するすべてのオブジェクトに配置されます。このオブジェクトでは、選択されたファイルリストでもあります。

このオブジェクトはアップロードフレーム内の配列要求をプッシュします。

ここでウォッチドッグが実行され、新しいリクエスト(ステータス= 0)があるかどうかを確認します。 新しいアップロードが開始されていることが検出された場合。

フレームセット:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>Insert title here</title> 
</head> 
<frameset rows="*,100"> 
    <frame id="start" name="start" src="start.html"> 
    <frame id="upload" name="upload" src="frame.html"> 
</frameset> 
<noframes> 
    <body> 
     <a href="start.html">please use this</a> 
    </body> 
</noframes> 
</html> 

start.htmlここ

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="UTF-8"> 
    <title>Start</title> 
    <script src="../js/jquery-1.11.3.min.js" ></script> 
    <script> 
    var files; 
    $.fn.serializeObject = function() 
    { 
     var o = {}; 
     var a = this.serializeArray(); 
     $.each(a, function() { 
      if (o[this.name] !== undefined) { 
       if (!o[this.name].push) { 
        o[this.name] = [o[this.name]]; 
       } 
       o[this.name].push(this.value || ''); 
      } else { 
       o[this.name] = this.value || ''; 
      } 
     }); 
     return o; 
    }; 

    var UploadRequest=function(f) 
    { 
     var o= {}; 
     o['guid']=guid(); 
     o['action']=$('form').attr('action'); 
     o['files']=files; 
     o['values']=$('form').serializeObject(); 
     o['status']=0; 
     return o; 
    } 

    function fileSelect(e){ 
     files=e.target.files; 
     return false; 
    } 

    </script> 
    </head> 
    <body> 
     <form id="test" action="phpinfo.php"> 
     <input name="test" > 
     <input type="hidden" name="h1" value="2"> 
     <input type="file" name="uploadfile" onchange="fileSelect(event)"> 
     <input type="submit" value="upload‚" > 
     </form> 
     <script> 
     var olddogcounter=localStorage['uploadwatchdog']; 
     var check=false; 
     function guid() { 
      function s4() { 
      return Math.floor((1 + Math.random()) * 0x10000) 
       .toString(16) 
       .substring(1); 
      } 
      return s4() + s4() + '-' + s4() + '-' + s4() + '-' + 
      s4() + '-' + s4() + s4() + s4(); 
     } 

     $(function() { 
      $('#test').submit(function() { 
       var request=new UploadRequest(); 
       parent.upload.requests.push(request); 
       return false; 
      }); 
     }); 
     </script> 
     <a href="test.html" >test</a> 
    </body> 
</html> 

とアップロードのフレーム:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>frame</title> 

</head> 
<body> 
    <h1>frame</h1> 

    <iframe id="response" width="100%" height="200"></iframe> 

    <script> 
     var requests=new Array(); 
     var counter=0; 
     function watchdog() 
     { 
      for(var i=0; i<requests.length; i++) 
      { 
       var request=requests[i]; 
       if(request.status==0) 
       { 
        alert("watchdog :"+dump(request)); 
        request.status=1; 
        uploadFile(request); 
       } 
      } 
     } 

     function uploadFile(request) 
     { 
     var url = request.action; 
     var xhr = new XMLHttpRequest(); 
     var fd = new FormData(); 
     xhr.open("POST", url, true); 
     xhr.onreadystatechange = function() { 
      if (xhr.readyState == 4 && xhr.status == 200) { 
       iframe=document.getElementById("response"); 
       iframe.src="data:text/html;charset=utf-8," + escape(xhr.responseText); 
      } 
     }; 
     if(request.files.length>1) 
     { 
      for(var i=0; i<request.files.length;i++) 
      { 
       var file=request.files[i]; 
       fd.append("upload_file[]", file); 
      } 
     } 
     else 
     { 
      var file=request.files[0]; 
      fd.append("upload_file",file); 
     } 
     for(var key in request.values) 
     { 
      fd.append(key,request.values[key]); 
     } 
     xhr.send(fd); 
     } 
     window.setInterval(watchdog,2000); 
    </script> 
</body> 
</html> 

ここ

はそれをしようとする私のテストプロジェクトです解決策は完全ではありませんが、私は良い出発点だと思う。

TODO: - リスト でのアップロードの表示名 - アップロード に対してshow progessバー - - 配列からのアップロードの削除要求の後は を要求し、いくつかのエラー処理