ïŒãã¡ããããŒãžããªããŒãããã«ïŒãµãŒããŒã«è€æ°ã®ãã¡ã€ã«ãåæã«ã¢ããããŒãããã¿ã¹ã¯ã«åã³çŽé¢ãããšããç§ã¯ãã¡ã€ã«ã®ajaxããŠã³ããŒããã·ãã¥ã¬ãŒãã§ãããããªãäžåšçšãªjQueryãã©ã°ã€ã³ãæ¢ããŠã€ã³ã¿ãŒãããããµãŒãã£ã³ãå§ããŸããïŒåããã©ã°ã€ã³é ããããã¬ãŒã ïŒjavaããã³flashãã©ã°ã€ã³ãæåŠããããšãããã«æ±ºå®ãããŸããã æ€çŽ¢ããã»ã¹ã§ã¯ã次ã®html 5æšæºã§ã¯ããã¡ã€ã«ãæäœããæ©èœã倧å¹
ã«æ¡åŒµãããã¹ãã§ããããããã®æ©èœã®äžéšãçŸåšå©çšå¯èœã§ããããšãæãåºããŸããã ãã®çµæãããããå®éã«ãã¹ãããããšã決å®ãããŸããã
ãµãŒããŒãžã®è€æ°ã®åçã®åæã¢ããããŒãã®äŸã䜿çšããŠãFile APIã®å¯èœæ§ãæ€èšããŸãã èšäºã®æåŸã«ãæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ãjQueryãã©ã°ã€ã³ã®åœ¢åŒã§æ瀺ãããŠããŸãã
ãããèªã¿ãããããŸãããæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã«èå³ããããŸãã
ãããã£ãŠãFile APIã䜿çšããå©ç¹ã¯äœã§ããã
- å€éšãã©ã°ã€ã³ããã®ç¬ç«
- ããŠã³ããŒãããã»ã¹ãå¶åŸ¡ããããã«é¢ããæ
å ±ã衚瀺ããæ©èœïŒããã°ã¬ã¹ããŒã¯åžžã«ãŠãŒã¶ãŒã«å¿èãäžããŸãïŒ
- ããŠã³ããŒãããåã«ãã¡ã€ã«ãèªã¿åã£ãŠãã®ãµã€ãºã調ã¹ãæ©èœïŒãã®äŸã§ã¯ãç»åãå«ãŸãªããã¡ã€ã«ãé€å€ããŠç»åã®ãµã ãã€ã«ã衚瀺ããããšãã§ããŸãïŒ
- æšæºãã¡ã€ã«éžæãã£ãŒã«ããä»ããŠè€æ°ã®ãã¡ã€ã«ãäžåºŠã«éžæããæ©èœ
- ãã©ãã°ã¢ã³ãããããã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠãã¡ã€ã«ãéžæããæ©èœã ã¯ãããã¡ã€ã«ããã©ãã°ã¢ã³ãããããããŠããã¹ã¯ãããããããŸãã¯ãšã¯ã¹ãããŒã©ãŒãªã©ããçŽæ¥ããŠã³ããŒãã§ããŸãã
æ¬ ç¹ã®ãã¡ããã©ãŠã¶ãŒã§ã®ãµããŒããäžååã§ããããšã«æ³šæããããšãã§ããŸãã çŸåšãFile APIã¯Firefoxâ¥3.6ããã³Chromeâ¥6.0ã®ã¿ããµããŒãããŠããŸãã Safariã¯ããã«ç«ã¡äžãããšæããŠããŸãããIEãšOperaã«ã€ããŠã¯äœãæããã§ã¯ãããŸããïŒèª°ããæ
å ±ãæã£ãŠãããããããŸããïŒã ãã¡ãããFile APIãIE9 BetaããµããŒãããŠããªãããšã¯æ®å¿µã§ãããIEéçºè
ãçŸåšhtml 5ã®è±å¯ãªãµããŒãã«åãã£ãŠããããšãèãããšãããã¯å¥åŠãªããšã§ãã
å®éã®äŸã¯
http://safron.pro/playground/html5uploader/ã§èŠãããšãã§ããŸãã以äžã¯æãéèŠãªã³ãŒãã¹ããããã§ãã
ãŸããhtmlã³ãŒããæ±ããŸãã ããã©ã«ãã®å
¥åèŠçŽ ããã¡ã€ã«ããã©ãã°ã¢ã³ãããããããããã®ã³ã³ãããããã³ç»åã®ãµã ãã€ã«ãé
眮ããulãªã¹ããå¿
èŠã§ãã
<div> <input type="file" name="file" id="file-field" multiple="true" /> </div> <div id="img-container"> <ul id="img-list"></ul> </div>
inputèŠçŽ ã«
multiple="true"
å±æ§ãæå®ãããŠããããšãé€ããŠãç¹å¥ãªããšã¯ãããŸããã ããã¯ãæšæºã®ãã¡ã€ã«éžæãã€ã¢ãã°ã§è€æ°ã®ãã¡ã€ã«ãäžåºŠã«éžæã§ããããã«ããããã«å¿
èŠã§ãã ã¡ãªã¿ã«ãFirefox 4以éããã©ãŠã¶ãŒã®éçºè
ã¯ãå€ãã®ã¿ã€ãã»ãã¿ãŒãå«ãæšæºã®ãã¡ã€ã«éžæãã£ãŒã«ããé衚瀺ã«ããé衚瀺ã®èŠçŽ ã®ã¯ãªãã¯ã€ãã³ããããªã¬ãŒããŠãã€ã¢ãã°ã衚瀺ã§ããããã«ãªããšçŽæããŠããŸãã
JavaScriptã«ç§»ããŸãããïŒDOMã®æäœãç°¡åã«ããããã«jQueryã䜿çšããããšã«æ³šæããŠãã ãããäœããã®çç±ã§jQueryãæŸæ£ããã人ã¯èª°ã§ãç°¡åã«ã¹ã¯ãªãããäœãçŽãããšãã§ããŸãïŒã æåã«ãã¡ã€ã³ã®åœ¹å²ã§äž»æŒããhtmlèŠçŽ ãžã®ãªã³ã¯ãå€æ°ã«ä¿åããŸãã 次ã«ãæšæºã®ãã¡ã€ã«éžæãã£ãŒã«ããšããã¡ã€ã«ããã©ãã°ã¢ã³ãããããã§ããé åã®ã€ãã³ããã³ãã©ãŒãå®çŸ©ããŸãã
ã©ã¡ãã®å Žåãããã³ãã©ãŒã§FileListãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ã§ããŸããããã¯ãæ¬è³ªçã«Fileãªããžã§ã¯ãã®é
åã§ãã ãã®é
åã¯displayFilesïŒïŒé¢æ°ã«æž¡ããããã®ããã¹ãã¯ä»¥äžã«ç€ºãããŠããŸãã
function displayFiles(files) { $.each(files, function(i, file) { if (!file.type.match(/image.*/)) {
Fileãªããžã§ã¯ãã«ã¯ãååããµã€ãºãã¿ã€ããªã©ã®ãã¡ã€ã«ã«é¢ããã¡ã¿ããŒã¿ïŒååããµã€ãºãã¿ã€ãã®ããããã£ã«ãããããMIME圢åŒïŒããšãã°ãimage / gifïŒãªã©ïŒãå«ãŸããŠããŸãã ãã¡ã€ã«ã®å
容ã«ã¢ã¯ã»ã¹ããããã«ãç¹å¥ãªFileReaderãªããžã§ã¯ãããããŸãã
displayFilesïŒïŒé¢æ°å
ã§ã転éããããã¡ã€ã«ã®é
åã調ã¹ãæåã«ç»åã§ã¯ãªããã®ãåãé€ããŸãã 次ã«ãç»åããšã«liãªã¹ãã®èŠçŽ ãäœæãããŸããimgèŠçŽ ã¯é
眮ããããŸã§ç©ºã§ãïŒãã¡ã€ã«ããããã£ã¯ã察å¿ãããªããžã§ã¯ããå«ãålièŠçŽ ã«ãäœæãããŸãïŒã ãã®åŸãFileReaderã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããã®ã€ã³ã¹ã¿ã³ã¹ã«onloadãã³ãã©ãŒãå®çŸ©ãããŸãããã®ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãããŒã¿ã¯ä»¥åã«äœæãããimgèŠçŽ ã®srcå±æ§ã«çŽæ¥è»¢éãããŸãã FileReaderãªããžã§ã¯ãã®readAsDataURLïŒïŒã¡ãœããã¯ãFileãªããžã§ã¯ãããã©ã¡ãŒã¿ãŒãšããŠåãåããããããããŒã¿ã®èªã¿åããéå§ããŸãã ãã®çµæãæšæºãã£ãŒã«ãã§éžæããããã¹ãŠã®ç»åããŸãã¯ãã©ãŠã¶ã«çŽæ¥ãã©ãã°ããããã¹ãŠã®ç»åã«ã€ããŠããµã ãã€ã«ïŒäººå·¥çã«150ãã¯ã»ã«ã«çž®å°ïŒã衚瀺ãããŸãã
ä»ã«ããã¹ãããšã¯äœã§ããïŒ éžæããããã¹ãŠã®ãã¡ã€ã«ããµãŒããŒã«ããŠã³ããŒãããã ãã§ãã ãããè¡ãã«ã¯ããã¿ã³ãŸãã¯ãªã³ã¯ãäœæããŸããã¯ãªãã¯ãããšãäœæããããã¹ãŠã®lièŠçŽ ã調ã¹ããã®ãã¡ã€ã«ããããã£ãèªã¿åãããããuploadFileïŒïŒé¢æ°ã«æž¡ãã ãã§ãã ããã§ã¯ãç°¡åã«ããããã«ãé¢æ°ãä»ããŠããŒããå®è£
ãã
httpïŒ//safron.pro/playground/html5uploader/ã«ããå®éã®äŸã§ã¯ãè¿œå ã®ãã©ã¡ãŒã¿ãŒãæž¡ãããšãã§ããäœæäžã«ããã¹ãŠã®ããŒãã¢ã¯ã·ã§ã³ãuploaderObjectãªããžã§ã¯ãã«åéããŸãããããŒãããã»ã¹ã«é¢ããæ
å ±ãååŸããã³ãŒã«ããã¯é¢æ°ãªã©ã
function uploadFile(file, url) { var reader = new FileReader(); reader.onload = function() { var xhr = new XMLHttpRequest(); xhr.upload.addEventListener("progress", function(e) { if (e.lengthComputable) { var progress = (e.loaded * 100) / e.total; } }, false); xhr.onreadystatechange = function () { if (this.readyState == 4) { if(this.status == 200) { } else { } } }; xhr.open("POST", url); var boundary = "xxxxxxxxx";
ããã«ãããäžèšãšåãæ¹æ³ã§ããã§ã«ããªãã¿ã®FileReaderãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããŸãã XMLHttpRequestãäœæãããonloadã€ãã³ããã³ãã©ãŒãå²ãåœãŠãããŸãïŒæ®å¿µãªããããã¡ã€ã«ã¯ãŸã æäŸãããŠããªããããjQuery ajaxã€ã³ã¿ãŒãã§ã€ã¹ã¯ãŸã 䜿çšã§ããŸããïŒã 2çªç®ã®ããŒãžã§ã³ã®XMLHttpRequestã§ã¯ãã¢ããããŒãããããã£ã衚瀺ãããŸãããã®ããããã£ã«ã¯ãé²è¡ç¶æ³ãèªã¿èŸŒã¿ãããã³ãšã©ãŒã€ãã³ããåŠçã§ããããŒããŒãªããžã§ã¯ããå«ãŸããŸãïŒè©³çŽ°ã«ã€ããŠã¯ã
httpïŒ//www.w3.org/TR/XMLHttpRequest2/#xmlhttprequesteventtargetãåç
§ããŠ
ãã ãã ïŒã äžèšã®äŸã¯ãprogressã€ãã³ãã®åŠçã®ã¿ã瀺ããŠããŸãã 次ã«ããªã¯ãšã¹ãå®äºãã³ãã©ãŒããªã¯ãšã¹ãèªäœã«å²ãåœãŠãŸãïŒããŒããŒãªããžã§ã¯ãã®ã€ãã³ããšã¯å¯Ÿç
§çã«ããã¹ãŠã®ããŒã¿ãããŠã³ããŒãããããµãŒããŒããã®å¿çãåä¿¡ããããšãã«æ¢ã«åŒã³åºãããŠããŸãïŒã2ã€ã®ããããŒãè¿œå ããŠããªã¯ãšã¹ãããã£ã圢æããFileReaderãªããžã§ã¯ãã®resultããããã£ããããŒã¿ãèªã¿åããŸãã ãã®åŸãããŠã³ããŒããéå§ãããŸãã çŸåšã®W3Cä»æ§ã«ãããšãXMLHttpRequestãªããžã§ã¯ãã®sendïŒïŒã¡ãœããã¯ãã©ã¡ãŒã¿ãŒã§ãã€ããªããŒã¿ãåãå
¥ããããšãã§ãããšç解ãããŠããŸãããããã¯Google Chromeã§æ£åžžã«å®è£
ãããŠããŸãããFirefoxã§ã¯ç¬èªã®æ¹æ³ã§ç¹å¥ãªsendAsBinaryïŒïŒã¡ãœãããä»ããŠè¡ãããŸãã ãããã£ãŠãéä¿¡ãéå§ããåã«ãsendAsBinaryïŒïŒã¡ãœãããèŠæ±ãªããžã§ã¯ãã§å®çŸ©ãããŠãããã©ããã確èªããå®çŸ©ãããŠããå Žåã¯ããã䜿çšããŸãã
å®éãããããã¹ãŠã§ãã html 5ã®æ¿èªãšé
åžã楜ãã¿ã«ããŠããŸãïŒ
ããã€ãã®ãªã³ã¯
- http://safron.pro/playground/html5uploader/-äžèšã§èª¬æãããã®ïŒããã³ãã®ä»ã®ãã®ïŒã®å®çšäŸ
- http://safron.pro/playground/html5uploader/full.zip-ã³ãŒãå
šäœã¯ã¢ãŒã«ã€ãã«ãããŸã
- http://html5test.com-ãã©ãŠã¶ãŒãHTML 5ã«æºæ ããŠãããã©ããã確èªããïŒéåžžã«èŠèŠçïŒ
- http://playground.html5rocks.com-Googleã®ã³ãŒããå®éšããããã®ãã©ãããã©ãŒã ïŒãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãå€æ°ã®Google APIã䜿çšãã人ã«ã¯éŠŽæã¿ãããã§ãããïŒ
UPD
äžèšã®ãã¹ãŠã®äœ¿çšãç°¡çŽ åããããã«ã
jQueryãã©ã°ã€ã³ãäœæãããŸããã ããã䜿çšãããšãå¯èœã§ããã°File APIã䜿çšããŠãã¡ã€ã«ãã¢ããããŒãããããã§ãªãå Žåã¯çœ®æïŒéåžžã®ãã©ãŒã éä¿¡ãªã©ïŒãå®è£
ã§ããŸãã åŽåè
ã®èŠæ±ã«å¿ããŠã
ã³ã¡ã³ããŒã¿ãŒã®
ã³ã¡ã³ãã«åŸã£ãŠãããããµããŒããããã©ãŠã¶ãŒïŒChromeãSafari 5 +ãFF 4+ïŒã®
FormDataãªããžã§ã¯ããä»ããŠããŠã³ããŒããè¿œå ãããŸããã ãã©ã°ã€ã³ãã¡ã€ã«ã®äžçªäžã«ã¯ããã©ã¡ãŒã¿ãŒãã¡ãœãããããã³ç°¡åãªäœ¿çšäŸã®èª¬æããããŸãã ããå®å
šãªäœ¿çšäŸã¯
ãã¡ãã«ãããŸã ïŒããã¯ãã®èšäºã®æåã®äŸã§ãããã©ã°ã€ã³ã®äœ¿çšã®ã¿ãããçŽãããµãŒããŒåŽãå«ããã®å®å
šãªã³ãŒãã¯
ããããããŠã³ããŒãã§ããŸã [UPD2ãåç
§]ïŒã
䜿çšãããœãŒã¹
- https://developer.mozilla.org/en/using_files_from_web_applications-Mozillaéçºè
Webãµã€ãã®ãã¡ã€ã«ã€ã³ã¿ãŒãã§ã€ã¹ã«é¢ããèšäº
- https://developer.mozilla.org/En/XMLHttpRequest/Using_XMLHttpRequest-åãå Žæã§ã®XMLHttpRequestã®äœ¿çšã«é¢ããèšäº
- http://www.w3.org/TR/FileAPI/-W3C Webãµã€ãã®File APIã®çŸåšã®ä»æ§
- http://www.w3.org/TR/XMLHttpRequest2/-åãå Žæã«ããçŸåšã®XMLHttpRequestä»æ§
UPD2
glebovginãŠãŒã¶ãŒã®ãªã¯ãšã¹ãã«ããããã©ã°ã€ã³ãå€æŽãããFileãªããžã§ã¯ãã ãã§ãªãBlobããŒã¿ïŒBlobãªããžã§ã¯ãïŒãçŽæ¥éä¿¡ã§ããããã«ãªããŸããã ããã¯ãããšãã°ãã£ã³ãã¹ã®ã³ã³ãã³ãããµãŒããŒã«éä¿¡ããå¿
èŠãããå ŽåããŸãã¯åã«æåã§çæãããããŒã¿ãããå Žåã«åœ¹ç«ã¡ãŸãã
ãã¢ïŒ
å¥ã®ã¢ãã¬ã¹ã«ãããã«ç§»åïŒã§ããã£ã³ãã¹ããç»åãéä¿¡ããäŸãè¿œå ãããŸããã çŸæç¹ã§ã¯ããã®æ©èœã¯FFãChromeãIE10ã§æ©èœããŸãã
ãœãŒã¹ã³ãŒãã
GitHubã§å©çšå¯èœã«ãªããŸãã ã ã³ã¡ã³ããææ¡ãæ¹åã¯å€§æè¿ã§ãïŒ