[drupal-devel] [feature] JS-based file upload

Steven drupal-devel at drupal.org
Fri Aug 19 13:08:08 UTC 2005

Issue status update for 
Post a follow up: 

 Project:      Drupal
 Version:      cvs
 Component:    upload.module
 Category:     feature requests
 Priority:     normal
 Assigned to:  Steven
 Reported by:  Steven
 Updated by:   Steven
-Status:       patch (code needs work)
+Status:       patch (code needs review)
 Attachment:   http://drupal.org/files/issues/jsupload_1.patch (14.63 KB)

Thox: this is also an existing behaviour/bug in upload.module. This
patch does not affect any of the underlying file saving or storage

It simply introduces an asynchronous form submission and result
display, but otherwise uses exactly the same code as the non-JS

Attached is an up-to-date, but otherwise unchanged version.


Previous comments:

Tue, 09 Aug 2005 01:13:03 +0000 : Steven

Attachment: http://drupal.org/files/issues/jsupload.patch (14.71 KB)

This patch adds JavaScript-based inline uploading (screenshot [1]).

It does this by redirecting the submission of the form to a hidden
<iframe> when you click "Attach" (we cannot submit data through Ajax
directly because you cannot read file contents from JS for security
Once the file is submitted, the upload-section of the form is updated.

Things to note:

* The feature degrades back to the current behaviour without JS.
* If there are errors with the uploaded file (disallowed type, too big,
...), they are displayed at the top of the file attachments fieldset.
* Though the hidden-iframe method sounds dirty, it's quite compact and
is 100% implemented in .js files. The drupal.js api makes it a snap to
* I included some minor improvements to the Drupal JS API and code.
* I added an API drupal_call_js() to bridge the PHP/JS gap: it takes a
function name and arguments, and outputs a <script> tag. The kicker is
that it preserves the structure and type of arguments, so e.g. PHP
associative arrays end up as objects in JS.
* I also included a progressbar widget [2] that I wrote for drumm's
ongoing update.php work. It includes Ajax status updating/monitoring,
but it is only used as a pure throbber in this patch. But as the code
was already written and is going to be used in the near future, I left
that part in. It's pretty small ;). If PHP supports ad-hoc upload info
in the future like Ruby on Rails, we can implement that in 5 minutes.

[1] http://www.acko.net/dumpx/jsupload.png
[2] http://www.acko.net/yay-progress


Tue, 09 Aug 2005 01:39:42 +0000 : Steven

Attachment: http://drupal.org/files/issues/progress.gif (1.22 KB)

This image belongs in the misc directory.


Tue, 09 Aug 2005 15:38:19 +0000 : m3avrck

This sounds like a great and much needed feature! I'm curious as to how
extendable this feature is because I would like to very soon create a
window that can be opened from a link (maybe even through TinyMCE) to
basically include links to documents on a Drupal website within the
content itself, instead of merely "attaching" them to the end of the
document. Taking this upload feature, along with better a file manager
could create quite an awesome webbased FTP like program that I know
many would find useful. I'll have to take a look at this patch much
more closely very soon.


Wed, 10 Aug 2005 21:44:18 +0000 : drumm


Works as expected and it degrades well (at first I didn't do a hard
refresh and my browser wasn't seeing the new js or css).


Wed, 17 Aug 2005 00:41:14 +0000 : Steven

Attachment: http://drupal.org/files/issues/jsupload_0.patch (14.6 KB)

Keeping up to date. Still needs confirmed testing on KHTML browsers like
Konqueror and Safari, please.


Wed, 17 Aug 2005 15:58:07 +0000 : Gabriel Radic

I'd be happy to test on Safari (1.2 and 2/1.3) and other WebKit browsers
and report the results here, but I can't apply the patch on any of my
installs (too risky) and don't have the time to set up a new Drupal

Steven, any chance for you to share a web page for me to test?



Wed, 17 Aug 2005 16:09:43 +0000 : stefan nagtegaal

Maybe it is me, but Steven why do you bother about the fact that this
will work on Safari? All other JS/AJAX we currently have in core
doesn't work with Safari...

Is it something special, or is t just curiocity?



Wed, 17 Aug 2005 16:35:43 +0000 : Steven

Mostly because I can't test it, and Javascript is a fidgety business.
But I have to admit I was surprised when I found out (recently!) that
Drupal JS doesn't work in Safari. The features we check for are all
basic W3C DOM stuff, I assumed Safari would support them.

Do we know why Safari doesn't work?


Wed, 17 Aug 2005 19:44:23 +0000 : Crell

I'm not sure about Drupal in particular, but Safari is missing a LOT Of
W3C DOM "stuff".  Many functions are there, but stubbed out and do
nothing.  Others are badly implemented.  It's closer to the standard
than IE is, but with the missing functionality I'm not sure which is
really easier to code for.  I don't know if Konqueror is crippled in
the same way, but I would suspect it is.  (I've not gotten any decent
Ajax to work in Konqueror myself, although I freely admit to not being
an expert on the subject.)


Wed, 17 Aug 2005 21:31:50 +0000 : stefan nagtegaal

Okay, I found out how to debug with Safari..

When I goto: '?q=node/add/$type', I get these errors:
- SyntaxError - Parse error (line 37)
- TypeError - Object (result of expression isJsEnabled) does not allow
calls (line 3)
- TypeError - Object (result of expression isJsEnabled) does not allow
calls (line 4)

Maybe you know what's wrong or what todo about it?


Thu, 18 Aug 2005 08:49:00 +0000 : Thox

After successfully attaching a file, the user can navigate away from the
page without pressing submit. The attachment shows up in the table, but
in this case the attachment isn't linked to the node.


Thu, 18 Aug 2005 14:17:01 +0000 : m3avrck

Now I haven't had time to play with this patch yet, but that last
comment gave me an idea.

Is there a JS check to see if the user is trying to navigate away from
the page? For example, they are uploading a file and click a link in
another app, all of a sudden that upload page they are on is replaced
by some other page. A simple JS check for this saying "Do you want to
leave this page and cancel the upload?" would certainly be a great
usability boost and prevent this from happening.


Thu, 18 Aug 2005 14:53:58 +0000 : tostinni

Retaking this idea of controlling if user is living a page or not, I
recently saw the new IPB permission panel demo, it makes an intense use
of AJAX and provide a way to keep track if the user is living the page.
See the demo here [3].
[3] http://blog.mattmecham.com/archives/2005/07/ipb_21_acp_perm.html


Thu, 18 Aug 2005 15:29:27 +0000 : Steven

Thox: this is by design, and no different from submitting a file by
doing a preview, and then navigating away from the edit page. "Changes
made to the attachments list will not be permanent until you save this

The patch simply streamlines the workflow.


Thu, 18 Aug 2005 22:02:17 +0000 : Dries

Patch doesn't apply.

(BTW, is it me or is the progress bar somewhat toy-ish and somewhat


Fri, 19 Aug 2005 08:39:58 +0000 : Thox

When attaching two or more files with the same without pressing submit,
the original file is overwritten and the table shows two files with the
same name. After pressing submit, the table shows one file.

More information about the drupal-devel mailing list