Some wikis view these files as attachment to the wiki. A link is provided to upload a file, the file is stored in a directory dedicated to uploaded files.
examples: UseMod 1.0, TwikiClone, ElispArea on the EmacsWiki
Problems of this solution:
Files are stored in an encoded form (MIME-encoded, uuencoded) in the normal page database, together with their MIME-type. Storing them on ordinary pages (mimencoded) would make reverting easy, and it would automatically produce entries on RecentChanges, do all the username/host/IP magic, and allow for edit summaries. It would also allow diffing, which makes no sense whatsoever, and viewing as mimencoded raw text, which also makes no sense.
To submit a new file, one just have to create a Wiki Page as usual and then choose the option to upload a file instead of editing a text as usual.
Linking directly to the file in a Wiki Page is done by using:
Wikis usually have the ability to directly inline the files, ie insert the image in the page if the file is an image
Binary files are bound to be bigger than the usual text submission. If the files are stored and served as ordinary files, your web server might already have a decent default setting that will handle caching for you.
If you keep images on the wiki, however, your WikiEngine will have to provide this information. If you allow people to upload new files, you want them to see the new files immediately, so having expiry times larger than a few seconds will confuse your users.
The solution is to react to the If-Modified-Since header that browsers send back to you on their next try, and immediately return a '304 Not modified' if appropriate. (This may require emitting an appropriate Cache-Control header on the outgoing side.) You've still got an incoming GET to deal with, but this at least saves the bandwidth of sending the whole (unchanged) file over again while letting updates go through immediately.
Here's a quick demo (in PHP) that puts out some headers that seem to work:
<? header("Content-type: image/png"); header("Cache-Control: private, must-revalidate, max-age=0"); header("Expires: Mon, 15 Jan 2001 00:00:00 GMT"); header("Last-Modified: " . gmdate( "D, j M Y H:i:s", time() ) . " GMT"); if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) { readfile("check.png"); } else { readfile("nocheck.png"); // Cleared cache or first visit? } ?>
It's the value you send for "Last-Modified" that the user agent (ua) will come back with in an 'Is-Modified-Since'. To ensure that it asks every time (and will thus update when the file is changed), put 'must-revalidate' and a 'max-age' in the Cache-Control header. The 'private' will cause proxy servers to avoid caching the file while browsers still should; 'public' may be okay in your case, if every visitor should receive the same output. --BrionVibber
Without the max-age=10 info, the browsers may not revalidate the image (and thus not refresh). Look at the access log on the server. Does the browser do a separate request for the image? If not, the browser has decided that the cached copy is still fresh.
These caching things are fiendishly difficult to debug, unfortunately. If you're using Firebird, I recommend installing the "[Live HTTP headers]" extension. It's a little easier than running a packet sniffer over your connections, but it won't help for tracking down issues specific to other browsers. --BrionVibber
SoftSecurity for files does not have to be the same as SoftSecurity for normal wiki pages. Here are few considerations specific to file uploads.
The WikiWay can work for images too. On WikiPedia we support uploads of images; people can of course upload porn or whatever, and other people can delete it. All uploads are logged and appear in both a log page and RecentChanges. When an upload is replaced, the old versions are kept available in an archive, with a single click to revert in case of accidental name collisions or petty vandalism replacements. As a speed bump, the upload capability is only available and advertised to users who've logged in. -- BrionVibber
UseModWiki 1.0 has a minimal file upload feature available only to "editors" (with a special edit password) and admins by default. (There is a setting to allow everyone to upload for private wikis.) -- CliffordAdams
OddMuse stores files on normal pages, MIME-encoded, together with their MIME-type. You can upload new files using the edit action, and download the files using the download action. The download action will display images nicely, for example, because the file is served with the correct MIME-type. Furthermore, editing such a page will automatically replace the textarea with a filefield. When saving, no diffs are saved. When browsing the page, the page content will be replaced with an img link inlining the image (via the download action), or if the MIME-type is not of type 'image/*', the page content will be replaced with an ordinary link to download the file (also via the download action). When editing a page, you can switch it from text-editing to file-uploading mode and back. -- AlexSchroeder
These are some
In the index file use a flag to indicate the type of page (text or embedding a file, possibly with its mime type) when rendering a link check this flag to see the type of the page and render the link accordingly ie :
I don't like the [image:animage] [link:text] because:
I like to use the same freelink link because:
adding a flag would make it easy to provide lists of files on the wiki
The benefits are:
Against this:
instead of the ? use two links (create | upload) to be able to go directly to the form you want. Though this may be to much.
Not related to upload I wonder if using a link like (create) would be better than the mysterious ? link --PierreGaston
As far as I can tell, there are several use cases:
Therefore I think if we are talking about normal attachments, using normal link syntax is enough. This will take us to the source page, and there we can download the attachment.
For images, however, the requirements are slightly different. Therefore I think it is valid to add a new text formatting rule. After all, if the same formatting rule does different things depending on what kind of document is saved at the other end of the link, then that is difficult to understand as well.
However, a link that does different things depending on what kind of document is saved at the other end might prevent some common mistakes for newbies.
I don't like to change the pageidx file, because regenerating it now just requires us to examine the page directories , without actually examining the contents of the files. And since deleting it regenerates the pageidx, we can delete it often just to make sure that it gets regenerated correctly. It is resilient against failures. The new solution would be either expensive or brittle.
A simple Alternative [to FileReplacement]: Anybody May Upload
Another similar idea from the EmacsWiki: It should be possible to upload programs to the wiki, and it should be easy: No ftp, no passwords. At the same time, it should be possible to undo the works
of vandals. A wiki page would have been great. However, a simpler solution was chosen because the wiki is there for the content, and a new file archive had to be created quickly.
The upload of files happens via a little Perl script.
It will save the file you upload immediately. It will also create a backup file if there is no backup file or if the existing backup file is older than two weeks. Furthermore, it will maintain a list of recent uploads where it uses your wiki username or your host name.
It will also compress any file that is larger than 20k, and if the file is bigger than 100k, only the compressed version is linked from the index and changelog pages. If the file size is between 20k and 100k, both the plain text and the compressed version are linked.
There is a new InterMap link such that Lisp:color-theme.el.gz will link to the correct file.
Therefore:
This is even more "Wiki" as it follows WikiWiki's one-backup EditCopy model, minus RecentChanges.