Skip to content

Commit ab2a55f

Browse files
committed
wrap returned file objects to expose fullPath to clients
also auto-correct browsers that misreport the dropped file mime type
1 parent 99a554e commit ab2a55f

File tree

4 files changed

+49
-31
lines changed

4 files changed

+49
-31
lines changed

package.json

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,26 +27,28 @@
2727
"extends": "airbnb-base"
2828
},
2929
"dependencies": {
30-
"babel-runtime": "^6.11.6"
30+
"babel-runtime": "6.11.x",
31+
"mime-types": "2.1.x"
3132
},
3233
"devDependencies": {
33-
"babel-cli": "^6.16.0",
34-
"babel-core": "^6.17.0",
35-
"babel-eslint": "^7.0.0",
36-
"babel-plugin-transform-runtime": "^6.15.0",
37-
"babel-preset-latest": "^6.16.0",
38-
"babel-preset-stage-0": "^6.16.0",
39-
"babel-register": "^6.16.3",
40-
"chai": "^4.0.0-canary.1",
41-
"coveralls": "^2.11.14",
42-
"del": "^2.2.2",
43-
"eslint": "^3.8.0",
44-
"eslint-plugin-import": "^2.2.0",
45-
"istanbul": "^1.1.0-alpha.1",
46-
"mocha": "^3.1.2",
47-
"rollup": "^0.36.3",
48-
"rollup-plugin-babel": "^2.6.1",
49-
"sinon": "^2.0.0-pre.3"
34+
"babel-cli": "6.16.x",
35+
"babel-core": "6.17.x",
36+
"babel-eslint": "7.0.x",
37+
"babel-plugin-transform-runtime": "6.15.x",
38+
"babel-polyfill": "6.23.x",
39+
"babel-preset-latest": "6.16.x",
40+
"babel-preset-stage-0": "6.16.x",
41+
"babel-register": "6.16.x",
42+
"chai": "4.0.0-canary.1",
43+
"coveralls": "2.11.x",
44+
"del": "2.2.x",
45+
"eslint": "3.8.x",
46+
"eslint-plugin-import": "2.2.x",
47+
"istanbul": "1.1.0-alpha.1",
48+
"mocha": "3.1.x",
49+
"rollup": "0.36.x",
50+
"rollup-plugin-babel": "2.6.x",
51+
"sinon": "2.0.0-pre.3"
5052
},
5153
"scripts": {
5254
"lint": "eslint src",

src/Html5FileSelector.js

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import mimeTypes from 'mime-types';
2+
13
const DEFAULT_FILES_TO_IGNORE = [
24
'.DS_Store', // OSX indexing file
35
'Thumbs.db' // Windows indexing file
@@ -39,10 +41,28 @@ function traverseDirectory(entry) {
3941
});
4042
}
4143

44+
// package the file in an object that includes the fullPath from the file entry
45+
// that would otherwise be lost
46+
function packageFile(file, entry) {
47+
let fileTypeOverride = '';
48+
// handle some browsers sometimes missing mime types for dropped files
49+
const hasExtension = file.name.lastIndexOf('.') !== -1;
50+
if (hasExtension && !file.type) {
51+
fileTypeOverride = mimeTypes.lookup(file.name);
52+
}
53+
return {
54+
fileObject: file,
55+
type: file.type ? file.type : fileTypeOverride,
56+
name: file.name,
57+
size: file.size,
58+
fullPath: entry ? entry.fullPath : file.name
59+
};
60+
}
61+
4262
function getFile(entry) {
4363
return new Promise((resolve) => {
4464
entry.file((file) => {
45-
resolve(file);
65+
resolve(packageFile(file, entry));
4666
});
4767
});
4868
}
@@ -89,7 +109,7 @@ export function getDataTransferFiles(dataTransfer) {
89109
} else if (filePromises.length) {
90110
return handleFilePromises(filePromises, dataTransferFiles);
91111
}
92-
return dataTransferFiles;
112+
return Promise.resolve(dataTransferFiles);
93113
}
94114

95115
/**
@@ -102,22 +122,20 @@ export function getDataTransferFiles(dataTransfer) {
102122
* and subfolders of the dropped/selected items.
103123
*/
104124
export function getDroppedOrSelectedFiles(event) {
125+
105126
const dataTransfer = event.dataTransfer;
106127
if (dataTransfer && dataTransfer.items) {
107-
return Promise.resolve(getDataTransferFiles(dataTransfer));
128+
return getDataTransferFiles(dataTransfer).then((fileList) => {
129+
return Promise.resolve(fileList);
130+
});
108131
}
109132
const files = [];
110133
const dragDropFileList = dataTransfer && dataTransfer.files;
111134
const inputFieldFileList = event.target && event.target.files;
112-
const fileList = dragDropFileList || inputFieldFileList;
135+
const fileList = dragDropFileList || inputFieldFileList || [];
113136
// convert the FileList to a simple array of File objects
114137
for (let i = 0; i < fileList.length; i++) {
115-
files.push(fileList[i]);
138+
files.push(packageFile(fileList[i]));
116139
}
117140
return Promise.resolve(files);
118141
}
119-
120-
export default {
121-
getDataTransferFiles,
122-
getDroppedOrSelectedFiles
123-
};

src/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,4 @@
55
* LICENSE.txt file in the root directory of this source tree.
66
*/
77

8-
import { getDataTransferFiles, getDroppedOrSelectedFiles } from './Html5FileSelector.js';
9-
export { getDataTransferFiles, getDroppedOrSelectedFiles };
8+
export { getDataTransferFiles, getDroppedOrSelectedFiles } from './Html5FileSelector.js';

test/Html5FileSelctorSpec.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ function createDataTransferItemFolder(containedFiles) {
4444
return {
4545
isDirectory: true,
4646
isFile: false,
47-
numberOfNestedFiles: containedFiles.length,
4847
createReader: () => {
4948
return {
5049
sentEntries: false, // not part of the actual API, just used for real API behavior mimicking

0 commit comments

Comments
 (0)