Skip to content

Commit e2f7025

Browse files
committed
Using extensions as accepted files is now possible.
Closes dropzone#182
1 parent 23e6284 commit e2f7025

File tree

2 files changed

+70
-43
lines changed

2 files changed

+70
-43
lines changed

src/dropzone.coffee

+28-19
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,17 @@ class Dropzone extends Em
9191
# property, and if the Dropzone is clickable this will be used as
9292
# `accept` attribute.
9393
#
94+
# This is a comma separated list of mime types or extensions. E.g.:
95+
#
96+
# audio/*,video/*,image/png,.pdf
97+
#
9498
# See https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept
9599
# for a reference.
96-
acceptedMimeTypes: null # eg: "audio/*,video/*,image/*"
100+
acceptedFiles: null
97101

98102
# @deprecated
99-
# Use acceptedMimeTypes instead.
100-
acceptParameter: null
103+
# Use acceptedFiles instead.
104+
acceptedMimeTypes: null
101105

102106
# If false, files will not be added to the process queue automatically.
103107
# This can be useful if you need some additional user input before sending
@@ -381,7 +385,12 @@ class Dropzone extends Em
381385

382386
throw new Error "No URL provided." unless @options.url
383387

384-
throw new Error "You can't provide both 'acceptParameter' and 'acceptedMimeTypes'. 'acceptParameter' is deprecated." if @options.acceptParameter and @options.acceptedMimeTypes
388+
throw new Error "You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated." if @options.acceptedFiles and @options.acceptedMimeTypes
389+
390+
# Backwards compatibility
391+
if @options.acceptedMimeTypes
392+
@options.acceptedFiles = @options.acceptedMimeTypes
393+
delete @options.acceptedMimeTypes
385394

386395
@options.method = @options.method.toUpperCase()
387396

@@ -442,10 +451,7 @@ class Dropzone extends Em
442451
@hiddenFileInput.setAttribute "type", "file"
443452
@hiddenFileInput.setAttribute "multiple", "multiple"
444453

445-
@hiddenFileInput.setAttribute "accept", @options.acceptedMimeTypes if @options.acceptedMimeTypes?
446-
447-
# Backwards compatibility
448-
@hiddenFileInput.setAttribute "accept", @options.acceptParameter if @options.acceptParameter?
454+
@hiddenFileInput.setAttribute "accept", @options.acceptedFiles if @options.acceptedFiles?
449455

450456
# Not setting `display="none"` because some browsers don't accept clicks
451457
# on elements that aren't displayed.
@@ -659,11 +665,11 @@ class Dropzone extends Em
659665
# (This allows for asynchronous validation)
660666
#
661667
# This function checks the filesize, and if the file.type passes the
662-
# `acceptedMimeTypes` check.
668+
# `acceptedFiles` check.
663669
accept: (file, done) ->
664670
if file.size > @options.maxFilesize * 1024 * 1024
665671
done @options.dictFileTooBig.replace("{{filesize}}", Math.round(file.size / 1024 / 10.24) / 100).replace("{{maxFilesize}}", @options.maxFilesize)
666-
else unless Dropzone.isValidMimeType file.type, @options.acceptedMimeTypes
672+
else unless Dropzone.isValidFile file, @options.acceptedFiles
667673
done @options.dictInvalidFileType
668674
else
669675
@options.accept.call this, file, done
@@ -897,7 +903,7 @@ class Dropzone extends Em
897903
# Finally add the file
898904
# Has to be last because some servers (eg: S3) expect the file to be the
899905
# last parameter
900-
formData.append @options.paramName, file
906+
formData.append "#{@options.paramName}", file
901907

902908
xhr.send formData
903909

@@ -1072,19 +1078,22 @@ Dropzone.getElements = (els, name) ->
10721078
# Validates the mime type like this:
10731079
#
10741080
# https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept
1075-
Dropzone.isValidMimeType = (mimeType, acceptedMimeTypes) ->
1076-
return yes unless acceptedMimeTypes # If there are no accepted mime types, it's OK
1077-
acceptedMimeTypes = acceptedMimeTypes.split ","
1081+
Dropzone.isValidFile = (file, acceptedFiles) ->
1082+
return yes unless acceptedFiles # If there are no accepted mime types, it's OK
1083+
acceptedFiles = acceptedFiles.split ","
10781084

1085+
mimeType = file.type
10791086
baseMimeType = mimeType.replace /\/.*$/, ""
10801087

1081-
for validMimeType in acceptedMimeTypes
1082-
validMimeType = validMimeType.trim()
1083-
if /\/\*$/.test validMimeType
1088+
for validType in acceptedFiles
1089+
validType = validType.trim()
1090+
if validType.charAt(0) == "."
1091+
return yes if file.name.indexOf(validType, file.name.length - validType.length) != -1
1092+
else if /\/\*$/.test validType
10841093
# This is something like a image/* mime type
1085-
return yes if baseMimeType == validMimeType.replace /\/.*$/, ""
1094+
return yes if baseMimeType == validType.replace /\/.*$/, ""
10861095
else
1087-
return yes if mimeType == validMimeType
1096+
return yes if mimeType == validType
10881097

10891098
return no
10901099

test/test.coffee

+42-24
Original file line numberDiff line numberDiff line change
@@ -122,41 +122,53 @@ describe "Dropzone", ->
122122
Dropzone.discover()
123123
expect(element3.dropzone).to.not.be.ok
124124

125-
describe "Dropzone.isValidMimeType()", ->
126-
it "should return true if called without acceptedMimeTypes", ->
127-
Dropzone.isValidMimeType("some/type", null).should.be.ok
125+
describe "Dropzone.isValidFile()", ->
126+
it "should return true if called without acceptedFiles", ->
127+
Dropzone.isValidFile({ type: "some/type" }, null).should.be.ok
128128

129129
it "should properly validate if called with concrete mime types", ->
130130
acceptedMimeTypes = "text/html,image/jpeg,application/json"
131131

132-
Dropzone.isValidMimeType("text/html", acceptedMimeTypes).should.be.ok
133-
Dropzone.isValidMimeType("image/jpeg", acceptedMimeTypes).should.be.ok
134-
Dropzone.isValidMimeType("application/json", acceptedMimeTypes).should.be.ok
135-
Dropzone.isValidMimeType("image/bmp", acceptedMimeTypes).should.not.be.ok
132+
Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes).should.be.ok
133+
Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes).should.be.ok
134+
Dropzone.isValidFile({ type: "application/json" }, acceptedMimeTypes).should.be.ok
135+
Dropzone.isValidFile({ type: "image/bmp" }, acceptedMimeTypes).should.not.be.ok
136136

137137
it "should properly validate if called with base mime types", ->
138138
acceptedMimeTypes = "text/*,image/*,application/*"
139139

140-
Dropzone.isValidMimeType("text/html", acceptedMimeTypes).should.be.ok
141-
Dropzone.isValidMimeType("image/jpeg", acceptedMimeTypes).should.be.ok
142-
Dropzone.isValidMimeType("application/json", acceptedMimeTypes).should.be.ok
143-
Dropzone.isValidMimeType("image/bmp", acceptedMimeTypes).should.be.ok
144-
Dropzone.isValidMimeType("some/type", acceptedMimeTypes).should.not.be.ok
140+
Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes).should.be.ok
141+
Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes).should.be.ok
142+
Dropzone.isValidFile({ type: "application/json" }, acceptedMimeTypes).should.be.ok
143+
Dropzone.isValidFile({ type: "image/bmp" }, acceptedMimeTypes).should.be.ok
144+
Dropzone.isValidFile({ type: "some/type" }, acceptedMimeTypes).should.not.be.ok
145145

146146
it "should properly validate if called with mixed mime types", ->
147147
acceptedMimeTypes = "text/*,image/jpeg,application/*"
148148

149-
Dropzone.isValidMimeType("text/html", acceptedMimeTypes).should.be.ok
150-
Dropzone.isValidMimeType("image/jpeg", acceptedMimeTypes).should.be.ok
151-
Dropzone.isValidMimeType("image/bmp", acceptedMimeTypes).should.not.be.ok
152-
Dropzone.isValidMimeType("application/json", acceptedMimeTypes).should.be.ok
153-
Dropzone.isValidMimeType("some/type", acceptedMimeTypes).should.not.be.ok
149+
Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes).should.be.ok
150+
Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes).should.be.ok
151+
Dropzone.isValidFile({ type: "image/bmp" }, acceptedMimeTypes).should.not.be.ok
152+
Dropzone.isValidFile({ type: "application/json" }, acceptedMimeTypes).should.be.ok
153+
Dropzone.isValidFile({ type: "some/type" }, acceptedMimeTypes).should.not.be.ok
154154

155155
it "should properly validate even with spaces in between", ->
156156
acceptedMimeTypes = "text/html , image/jpeg, application/json"
157157

158-
Dropzone.isValidMimeType("text/html", acceptedMimeTypes).should.be.ok
159-
Dropzone.isValidMimeType("image/jpeg", acceptedMimeTypes).should.be.ok
158+
Dropzone.isValidFile({ type: "text/html" }, acceptedMimeTypes).should.be.ok
159+
Dropzone.isValidFile({ type: "image/jpeg" }, acceptedMimeTypes).should.be.ok
160+
161+
it "should properly validate extensions", ->
162+
acceptedMimeTypes = "text/html , image/jpeg, .pdf ,.png"
163+
164+
Dropzone.isValidFile({ name: "somxsfsd", type: "text/html" }, acceptedMimeTypes).should.be.ok
165+
Dropzone.isValidFile({ name: "somesdfsdf", type: "image/jpeg" }, acceptedMimeTypes).should.be.ok
166+
Dropzone.isValidFile({ name: "somesdfadfadf", type: "application/json" }, acceptedMimeTypes).should.not.be.ok
167+
Dropzone.isValidFile({ name: "some-file file.pdf", type: "random/type" }, acceptedMimeTypes).should.be.ok
168+
# .pdf has to be in the end
169+
Dropzone.isValidFile({ name: "some-file.pdf file.gif", type: "random/type" }, acceptedMimeTypes).should.not.be.ok
170+
Dropzone.isValidFile({ name: "some-file file.png", type: "random/type" }, acceptedMimeTypes).should.be.ok
171+
160172

161173
describe "Dropzone.getElement() / getElements()", ->
162174
tmpElements = [ ]
@@ -221,9 +233,9 @@ describe "Dropzone", ->
221233
dropzone = new Dropzone element, url: "url"
222234
expect(-> new Dropzone element, url: "url").to.throw "Dropzone already attached."
223235

224-
it "should throw an exception if both acceptParameter and acceptedMimeTypes are specified", ->
236+
it "should throw an exception if both acceptedFiles and acceptedMimeTypes are specified", ->
225237
element = document.createElement "div"
226-
expect(-> dropzone = new Dropzone element, url: "test", acceptParameter: "param", acceptedMimeTypes: "types").to.throw "You can't provide both 'acceptParameter' and 'acceptedMimeTypes'. 'acceptParameter' is deprecated."
238+
expect(-> dropzone = new Dropzone element, url: "test", acceptedFiles: "param", acceptedMimeTypes: "types").to.throw "You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated."
227239

228240
it "should set itself as element.dropzone", ->
229241
element = document.createElement "div"
@@ -260,6 +272,12 @@ describe "Dropzone", ->
260272
forceFallback: on
261273
fallback: -> done()
262274

275+
it "should set acceptedFiles if deprecated acceptedMimetypes option has been passed", ->
276+
dropzone = new Dropzone element,
277+
url: "/some/other/url"
278+
acceptedMimeTypes: "my/type"
279+
dropzone.options.acceptedFiles.should.equal "my/type"
280+
263281
describe "options.clickable", ->
264282
clickableElement = null
265283
dropzone = null
@@ -293,7 +311,7 @@ describe "Dropzone", ->
293311
describe "clickable", ->
294312

295313
dropzones =
296-
"using acceptParameter": new Dropzone(Dropzone.createElement("""<form action="/"></form>"""), { clickable: yes, acceptParameter: "audio/*,video/*" })
314+
"using acceptedFiles": new Dropzone(Dropzone.createElement("""<form action="/"></form>"""), { clickable: yes, acceptedFiles: "audio/*,video/*" })
297315
"using acceptedMimeTypes": new Dropzone(Dropzone.createElement("""<form action="/"></form>"""), { clickable: yes, acceptedMimeTypes: "audio/*,video/*" })
298316

299317
it "should not add an accept attribute if no acceptParameter", ->
@@ -414,13 +432,13 @@ describe "Dropzone", ->
414432
it "shouldn't pass if the filesize is too big", ->
415433
dropzone.accept { size: 10 * 1024 * 1024, type: "audio/mp3" }, (err) -> err.should.eql "File is too big (10MB). Max filesize: 4MB."
416434

417-
it "should properly accept files which mime types are listed in acceptedMimeTypes", ->
435+
it "should properly accept files which mime types are listed in acceptedFiles", ->
418436

419437
dropzone.accept { type: "audio/mp3" }, (err) -> expect(err).to.be.undefined
420438
dropzone.accept { type: "image/png" }, (err) -> expect(err).to.be.undefined
421439
dropzone.accept { type: "audio/wav" }, (err) -> expect(err).to.be.undefined
422440

423-
it "should properly reject files when the mime type isn't listed in acceptedMimeTypes", ->
441+
it "should properly reject files when the mime type isn't listed in acceptedFiles", ->
424442

425443
dropzone.accept { type: "image/jpeg" }, (err) -> err.should.eql "You can't upload files of this type."
426444

0 commit comments

Comments
 (0)