Tab Atkins Jr. wrote:
On Mon, Dec 22, 2008 at 1:33 PM, Martin Atkins <m...@degeneration.co.uk> wrote:
However, I'm not sure what the solution is here. If contentEditable was a
"real" form widget you could imagine it supporting a multipart/form-data
upload of all of its contained images, or something. However, as long as
client-side code is manually shifting the data to and from real widgets it's
not clear how to do this since you can't just create a file-upload control
with the filename pre-populated and submit it transparently.
You can't create a file input with the filename pre-filled for obvious
security reasons, but you *can* still do some clever stuff here. In
order to add a picture you'll probably need them to go through a file
dialog anyway to select the picture, and you can make this *actually*
be the file dialog of a hidden file input. You can then move this
input around in the DOM without clearing its value, and submit it
transparently.
It's a bit hacky, but hey, web security is Serious Business.
This is indeed the solution I employed in a webapp I developed some time
ago. The main irritation with it was that I needed to submit the image
to the server before it could be displayed in the WYSIWYG view, which
required considerable hoop-jumping to put the image in a transient
location that would eventually be cleaned up if the user didn't actually
end up using the image on the page, or didn't save the page at all. It
also didn't work in the copy-paste case, though admittedly in that
situation we usually just ended up linking to off-site images rather
than file: URLs, since the copy-pasting was from other websites.
In an ideal world, the content and all embedded media would be submitted
together in the ultimate form submission. One approach would be to use
multipart/form-data and have the browser act as if the images were in
file upload form widgets, and another approach suggested by another
poster was to include the image using a data: URL. In both cases I would
still want to do some server-side work after submission to extract the
images and store them separately, but at least the user experience
matches the expectation that the image is part of the document.
Of course, neither of these approaches have particularly great fallback
behavior. The data: URL approach looks the most promising, but apps that
are not written with that in mind will presumably end up serving the
content with data: URLs and confusing downlevel browsers. At least it'll
do something sensible in modern browsers, though, while still making the
images available for extraction server-side if desired.