반응형
반응형

Drag and drop a folder onto Chrome now available

As web apps evolve, you might have found it handy to let users drag and drop files from the desktop onto the browser to edit, upload, share, etc. But unfortunately, we’ve been unable to drag and drop folders onto web pages. Luckily, beginning with Chrome 21, this issue will be addressed (already available in the Chrome dev channel).

Passing multiple files with drag and drop

Let’s look at a code sample of existing drag and drop.

<div id=”dropzone”></div>

var dropzone = document.getElementById('dropzone');
dropzone.ondrop = function(e) {
  var length = e.dataTransfer.files.length;
  for (var i = 0; i < length; i++) {
    var file = e.dataTransfer.files[i];
    ... // do whatever you want
  }
};

In this example, you can actually drag and drop a file or files from the desktop to your browser, but when you try to pass a folder, notice that it will be either rejected or treated as a File object resulting in a failure.

How to handle dropped folders

Chrome 21 allows you to drop a folder or multiple folders into the browser window. To handle these, you need to change the way you handle dropped objects.

<div id=”dropzone”></div>

var dropzone = document.getElementById('dropzone');
dropzone.ondrop = function(e) {
  var length = e.dataTransfer.items.length;
  for (var i = 0; i < length; i++) {
    var entry = e.dataTransfer.items[i].webkitGetAsEntry();
    if (entry.isFile) {
      ... // do whatever you want
    } else if (entry.isDirectory) {
      ... // do whatever you want
    }
  }
};

Notice that a big difference here is that you can treat a dropped object as Entry (FileEntry or DirectoryEntry) by using new function called getAsEntry (webkitGetAsEntry).
After obtaining access to the Entry object, you can use standard file handling methods that were introduced in the FileSystem API specification. For example, this example shows how you can detect if a dropped object is a file or a directory by examining the .isFile (or the .isDirectory) field.

For further information regarding the FileSystem API, read Exploring the FileSystem APIs, regarding new drag and drop capability, read this document. Of course, these features are open standards or are waiting to become one soon.

반응형
반응형

 Integrating input[type="file"] with the Filesystem API

 - http://updates.html5rocks.com/tag/file-access


: http://html5-demos.appspot.com/static/dnd/all_types_of_import.html

Launch Demo

In a recent post, Eiji Kitamura highlighted a subtle, yet powerful new feature in the drag and drop APIs; the ability to drag in folders and retrieve them as HTML5 Filesystem API FileEntry and DirectoryEntry objects (done by accessing a new method on the DataTransferItem, .webkitGetAsEntry()).

What's remarkably cool about the .webkitGetAsEntry() extension is how elegant it makes importing files and entire folders. Once you have a FileEntry or DirectoryEntry from a drop event, it's a matter of using the Filesystem API's copyTo() to get it imported into your app.

An example of copying multiple dropped folders over to the filesystem:

var fs = null; // Cache filesystem for later.

// Not shown: setup drag and drop event listeners.
function onDrop(e) {
  e.preventDefault();
  e.stopPropagation();

  var items = e.dataTransfer.items;

  for (var i = 0, item; item = items[i]; ++i) { 
    var entry = item.webkitGetAsEntry();

    // Folder? Copy the DirectoryEntry over to our local filesystem.
    if (entry.isDirectory) {
      entry.copyTo(fs.root, null, function(copiedEntry) {
        // ...
      }, onError);
    }
  }
}

window.webkitRequestFileSystem(TEMPORARY, 1024 * 1204, function(fileSystem) {
  fs = fileSystem;
}, function(e) {
  console.log('Error', e);
});

Very nice! Again, the simplicity comes from integrating DnD with the Filesystem API calls.

Taking this one step further, we also have the ability to drag and drop a folder and/or files onto a normal <input type="file">, then access the entries as Filesystem directory or file entries. That is done through .webkitEntries:

<input type="file" multiple>

function onChange(e) {
  e.stopPropagation();
  e.preventDefault();

  var entries = e.target.webkitEntries; // Get all dropped items as FS API entries.

  [].forEach.call(entries, function(entry) {

    // Copy the entry into our local filesystem.
    entry.copyTo(fs.root, null, function(copiedEntry) {
      ...
    }, onError);

  });
}

document.querySelector('input[type="file"]').addEventListener('change', onChange);

I've put together a photo gallery demo to demonstrate these different techniques for importing files/folders.

Launch Demo

To learn more about the HTML5 Filesystem API, see Exploring the Filesystem APIs.

반응형
반응형

어떤 일을 달성하기로 결심했으면 그 어떤 지겨움과 혐오감도 불사하고 완수하라.

고단한 일을 해낸 데서 오는 자신감은 실로 엄청나다.


- 아놀드 베넷

반응형
반응형
성공한 상인과 그렇지 못한 상인의 차이점이 있다.
성공한 상인은 어제보다 지혜롭고, 어제보다 너그러우며,
어제보다 삶을 잘 알고, 어제보다 잘 베풀며,
어제보다 여유롭다는 것이다.
-리카싱 청쿵그룹 회장

상인에 국한되지 않고 성공한 모든 사람의 공통점일 것입니다.
남과의 경쟁이 아닌,
어제의 나 보다 조금이라도 더 좋아지려는 지난한 노력,
나 혼자만이 아닌 세상과 더불어 잘 살아가려는 노력이
우리에게 행복한 성공을 가져다주는 토대가 된다는 말씀, 잘 새겨봅니다.

반응형
반응형
가을은 하늘에 우물을 판다
파란 물로
그리운 사람의 눈을 적시기 위하여
 
깊고 깊은 하늘의 우물
그 곳에 어린 시절의 고향이 돈다

그립다는 거, 그건 차라리
절실한 생존 같은 거
가을은 구름밭에 파란 우물을 판다  
그리운 얼굴을 비치기 위하여  


- 조병화의 시<가을>(전문)에서 -


* 여름이 물러가고
가을이 살랑살랑 다가오고 있습니다.
산자락 가을 하늘에도 푸른 우물이 번져갑니다.
나뭇잎 사이에도 군데군데 푸른 우물이 보입니다.
"아, 가을이구나! 하늘도 높고 정말 푸르구나!"    
잠시 걸음을 멈춰 가을 하늘을 다시 봅니다.
어린 시절, 그리운 얼굴이 보입니다.
어느덧 내 눈도 스르르 젖어
우물이 됩니다.

반응형

'생활의 발견 > 아침편지' 카테고리의 다른 글

반짝이는 눈동자  (0) 2012.09.26
'마음의 기술' 하나만으로...  (0) 2012.09.25
하루에 한끼만 먹어라  (0) 2012.09.22
기쁨의 파동  (0) 2012.09.21
살아줘서 고마워요  (0) 2012.09.20
반응형
"끼니를 거르지 않고
매일 세 끼씩 배부르게 먹는 것이 정말로 몸에 좋을까?
지나치게 많이 먹었을 때 활동하는 생명력 유전자는
거의 없다. 그래서 포식이나 잘못된 식생활 탓으로
병에 걸리는 사람들이 끊이지 않는 것이다."


- 나구모 요시노리의《1일 1식》중에서 -


* 모든 것이 빠르게 달리고
그 와중에 너무 많이 먹어서 병이 나는 세상입니다.
늘 시간에 쫓기듯 바빠서, 게을러서, 그저 빨리 포만감을
느끼는 인스턴트로 몸을 채우다 보니 우리 몸이 갈수록
상하고 병들어 갑니다. 이제라도 내 몸을 위해 조금씩
비워보는 건 어떨까요? 물만 먹어도 살 수 있다는데
하루에 한 끼 정도면 충분할 것도 같습니다.
한 번 시도해 보시지요. 
반응형

'생활의 발견 > 아침편지' 카테고리의 다른 글

'마음의 기술' 하나만으로...  (0) 2012.09.25
푸른 우물  (0) 2012.09.24
기쁨의 파동  (0) 2012.09.21
살아줘서 고마워요  (0) 2012.09.20
드레싱  (0) 2012.09.19

+ Recent posts