sc-upld
文件大小: unknow
源码售价: 5 个金币 积分规则     积分充值
资源说明:AJAX file upload, backend implemented in Clojure
# -*- mode: org -*-

* sc-upld

(Titel is intentionally left obfuscated; SEO = Search Engine Obfuscation)

This is a Clojure implementation for the given problem.

Author: Stefan Hübner, August 2011

Public URL: [[http://sthuebner-superupload.elasticbeanstalk.com/][AWS Beanstalk instance]]

Bug tracking: [[https://github.com/sthuebner/sc-upld/issues][GitHub]]

* How it works

The application provides a couple of HTTP endpoints:

- =GET /= :: redirects to /upload.html
- =GET /upload.html= :: form to upload a file
- =POST /upload/[id]= :: upload a file associated with a given ID
- =POST /upload/[id]/description= :: associate a description with an upload
- =GET /upload/[id]= :: provide data about an uploaded file
  - accept "application/json" :: JSON format
  - accept "*" :: HTML format
- =GET /upload/[id]/progress= :: provide progress information for an
  uploading file
- =GET /upload/[id]/file= :: provide the file to the client

All of these endpoints are implemented in sthuebner/superupload/core.clj

** GET /upload.html

Provides the UI for the application.

When a user selects a local file, a semi unique ID is generated and
the file along with meta information is posted to /upload/[id].

Once an upload started, a description can be provided and saved with
the file when the upload is finished.

** POST /upload/[id]

Expects a multipart form containing a file and meta information. The
file gets stored on disk and meta information is stored in an
in-memory structure (see sthuebner/superupload/storage.clj)

Uploaded files are stored temporarilly and get deleted when the
application shuts down.

** POST /upload/[id]/description

Expects a form containing a description field, associating its value
with the respective upload.

** GET /upload/[id]

Provides information about an uploaded file - either in JSON
(if the client requests so by providing an appropriate Accept header)
or in HTML format.

** GET /upload/[id]/progress

Provides progress information about a running upload. This endpoint is
used by the UI to report upload progress back to the user.

** GET /upload/[id]/file

This endpoint provides to download the file.

* Implementation

The application backend is implemented in Clojure using [[https://github.com/mmcgrana/ring][Ring]] and
[[https://github.com/cgrand/moustache][Moustache]] for HTTP routing and parsing.

The frontend is implemented in plain HTML and JavaScript.

* How to use the UI

- go to http://sthuebner-superupload.elasticbeanstalk.com/
- click "Choose File" and select a local file
- once the file is selected the upload starts and progress information
  is shown
- while uploading you can then provide a description
- save the description when the upload is finished
- you'll be shown a page with a link to your file, the server side
  filename it is stored as, plus the description you provided.

* What's left

More tests! I'm not experienced with GUI testing - in particular AJAX,
but lacking UI tests a pain point of the implementation.

Some basic backend tests are included and can be run using '=lein
test='. They also can be heavily improved and I'll be working on that.

* How to run it
** TODO CLI

TBD

** Leiningen

- run '=lein install plugin lein-ring 0.4.5=' (only needed once)
- run '=lein ring server-headless [port]=' (default port is 3000)

** Servlet Container (Tomcat, etc.)

- run '=lein ring uberwar=' to build a WAR including all dependencies
- deploy it on a servlet container of your choice

* How to work with the code

This is how I develop in Emacs using SLIME and Swank:

- download the code
- install [[https://github.com/technomancy/leiningen][Leiningen]]
- run '=lein install plugin swank-clojure 1.3.2=' (only needed once)
- run '=lein swank=' to open up Swank REPL
- open Emacs and run '=M-x slime-connect='

You'll be presented with a REPL directly running on the application
code.

本源码包内暂不包含可直接显示的源代码文件,请下载源码包。