From 7e9c29f27734f6f3ab91b78c08b5507bab7e2e96 Mon Sep 17 00:00:00 2001 From: fmurer Date: Mon, 4 Jan 2016 21:11:16 +0100 Subject: [PATCH] First setup of file_upload module analogous to the upload_image example --- modules/file_upload/cms_file_upload.e | 227 ++++++++++++++++-- modules/file_upload/cms_file_upload_api.e | 46 ---- modules/file_upload/cms_file_upload_module.e | 101 -------- ...{cms_file_upload.ecf => file_uploader.ecf} | 12 +- .../persistence/cms_file_upload_storage_i.e | 22 -- .../persistence/cms_file_upload_storage_sql.e | 30 --- 6 files changed, 205 insertions(+), 233 deletions(-) delete mode 100644 modules/file_upload/cms_file_upload_api.e delete mode 100644 modules/file_upload/cms_file_upload_module.e rename modules/file_upload/{cms_file_upload.ecf => file_uploader.ecf} (65%) delete mode 100644 modules/file_upload/persistence/cms_file_upload_storage_i.e delete mode 100644 modules/file_upload/persistence/cms_file_upload_storage_sql.e diff --git a/modules/file_upload/cms_file_upload.e b/modules/file_upload/cms_file_upload.e index fa75eda..8540f4c 100644 --- a/modules/file_upload/cms_file_upload.e +++ b/modules/file_upload/cms_file_upload.e @@ -1,5 +1,5 @@ note - description: "cms_file_upload application root class" + description: "file_upload application root class" date: "$Date$" revision: "$Revision$" @@ -7,44 +7,221 @@ class CMS_FILE_UPLOAD inherit - CMS_NODE + CMS_MODULE redefine - make_empty + install, + initialize, + setup_hooks end + CMS_HOOK_BLOCK + + CMS_HOOK_MENU_SYSTEM_ALTER + + WSF_ROUTED_URI_TEMPLATE_HELPER + + SHARED_EXECUTION_ENVIRONMENT + create - make_empty, make -feature {NONE} -- Initialisation +feature {NONE} -- Initialization - make_empty + make do - Precursor + name := "file_uploader" + version := "1.0" + description := "Service to upload some files" + package := "file upload" end feature -- Access - content_type: READABLE_STRING_8 + name: STRING -feature -- Access: node +feature {CMS_API} -- Module Initialization - summary: detachable READABLE_STRING_32 - -- A short summary of the node. - - content: detachable READABLE_STRING_32 - -- Content of the node. - - format: detachable READABLE_STRING_8 - -- Format associated with `content' and `summary'. - -- For example: text, mediawiki, html, etc - -feature -- Element change: node - - set_content (a_content: like content; a_summary: like summary; a_format: like format) + initialize (api: CMS_API) + -- do - content := a_content - summary := a_summary - format := a_format + Precursor (api) + end + +feature -- Module management + + install (api: CMS_API) + -- install the module + local + sql: STRING + do + -- create a database table + if attached {CMS_STORAGE_SQL_I} api.storage as l_sql_storage then + if not l_sql_storage.sql_table_exists ("file_upload_table") then + sql := "[ +CREATE TABLE file_upload_table( + `id` INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL CHECK("id">=0), + `name` VARCHAR(100) NOT NULL, + `uploaded_date` DATE, + `size` INTEGER +); + ]" + l_sql_storage.sql_execute_script (sql, Void) + if l_sql_storage.has_error then + api.logger.put_error ("Could not initialize database for file uploader module", generating_type) + end + end + Precursor {CMS_MODULE}(api) + end + end + +feature -- Access: router + + setup_router (a_router: WSF_ROUTER; a_api: CMS_API) + -- + local + www: WSF_FILE_SYSTEM_HANDLER + do + map_uri_template_agent ("/upload{?nb}", agent execute_upload_handler, void) + + create www.make_with_path (document_root) + www.set_directory_index (<<"index.html">>) + www.set_not_found_handler (agent execute_not_found) + a_router.handle("", www, a_router.methods_get) + end + +feature -- Hooks + + setup_hooks (a_hooks: CMS_HOOK_CORE_MANAGER) + do + + end + + block_list: ITERABLE [like {CMS_BLOCK}.name] + do + + end + + get_block_view (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE) + do + + end + + menu_system_alter (a_menu_system: CMS_MENU_SYSTEM; a_response: CMS_RESPONSE) + do + + end + +feature -- Configuration + + document_root: PATH + -- Document root to look for files or directories + once + Result := execution_environment.current_working_path.extended ("docs") + end + + files_root: PATH + -- Uploaded files will be stored in `files_root' folder + once + Result := document_root.extended ("files") + end + +feature -- Handler + + execute_not_found_handler (uri: READABLE_STRING_8; req: WSF_REQUEST; res: WSF_RESPONSE) + -- `uri' is not found, redirect to default page + do + res.redirect_now_with_content (req.script_url ("/"), uri + ": not found. %N Redirectioin to" + req.script_url ("/"), "text/html") + end + execute_upload_handler(req: WSF_REQUEST; res: WSF_RESPONSE; a_api: CMS_API) + local + body: STRING_8 + safe_filename: STRING_8 + path: PATH + page: WSF_HTML_PAGE_RESPONSE + n: INTEGER + do + if req.is_request_method ("GET") or else not req.has_uploaded_file then + create page.make + page.set_title ("EWF: Upload file") + page.add_style (req.script_url ("style.css"), "all") + create body.make_empty + page.set_body (body) + + -- create the body + body.append ("

EWF: Upload files

%N") + body.append ("
%N") + + -- tetermine how many files to upload by a query parameter ?nb=number_of_files + if attached {WSF_STRING} req.query_parameter ("nb") as p_nb and then p_nb.is_integer then + n := p_nb.integer_value + else + n := 1 + end + + -- llist for the number of wanted files a upload button + from + until + n = 0 + loop + body.append ("
%N") + n := n-1 + end + + -- set the submit button + body.append ("%N") + + res.send (page) + else + create body.make_empty + body.append ("

EWF: Uploaded files

%N") + body.append ("
    %N") + + n := 0 + + across + req.uploaded_files as u_file + loop + body.append ("
  • %N") + body.append ("
    " + u_file.item.name + "=" + html_encode (u_file.item.filename) + " size=" + u_file.item.size.out + " type" + u_file.item.content_type + "
    %N") + safe_filename := u_file.item.safe_filename + path := files_root.extended (safe_filename) + + -- TODO: list dhe uploaded items + + body.append ("
  • %N") + end + + body.append ("
%N") + + -- create page + create page.make + page.add_style ("../style.css", "all") + page.set_body (body) + res.send (page) + end + end + +feature {NONE} -- Encoder + + url_encode (s: READABLE_STRING_32): STRING_8 + -- URL Encode `s' as Result + do + Result := url_encoder.encoded_string (s) + end + + url_encoder: URL_ENCODER + once + create Result + end + + html_encode (s: READABLE_STRING_32): STRING_8 + -- HTML Encode `s' as Result + do + Result := html_encoder.encoded_string (s) + end + + html_encoder: HTML_ENCODER + once + create Result end end diff --git a/modules/file_upload/cms_file_upload_api.e b/modules/file_upload/cms_file_upload_api.e deleted file mode 100644 index 0240f0a..0000000 --- a/modules/file_upload/cms_file_upload_api.e +++ /dev/null @@ -1,46 +0,0 @@ -note - description: "Summary description for {CMS_FILE_UPLOAD_API}." - author: "" - date: "$Date$" - revision: "$Revision$" - -class - CMS_FILE_UPLOAD_API - -inherit - CMS_MODULE_API - rename - make as make_with_cms_api - redefine - initialize - end - -create - make - -feature {NONE} -- Initialization - - make (a_api: CMS_API; a_node_api: CMS_NODE_API) - -- (from CMS_MODULE_API) - do - node_api := a_node_api - make_with_cms_api(a_api) - end - - initialize - do - Precursor - - -- create the storage of type file - if attached storage.as_sql_storage as l_storage_sql then - create {CMS_FILE_UPLOAD_STORAGE_SQL} file_storage.make (l_storage_sql) - end - end - - -feature -- Access - - nod_api: CMS_NODE_API - - file_storage: CMS_FILE_UPLOAD_STORAGE_I -end diff --git a/modules/file_upload/cms_file_upload_module.e b/modules/file_upload/cms_file_upload_module.e deleted file mode 100644 index 5fcec9e..0000000 --- a/modules/file_upload/cms_file_upload_module.e +++ /dev/null @@ -1,101 +0,0 @@ -note - description: "Summary description for {CMS_FILE_UPLOAD_MODULE}." - author: "fmurer" - date: "$Date$" - revision: "$Revision$" - -class - CMS_FILE_UPLOAD_MODULE - -inherit - CMS_MODULE - rename - module_api as file_upload_api - redefine - install, - register_hooks - end - - CMS_HOOK_BLOCK - CMS_HOOK_MENU_SYSTEM_ALTER - -create - make - -feature {NONE} -- Initialisation - make - do - version := "1.0" - description := "Service to upload a file" - package := "file_upload" - add_dependency({CMS_NODE_MODULE}) - end - -feature -- Access - - name: STRING = "file_uploader" - - -feature -- Access: router - - setup_router(a_router: WSF_ROUTER; a_api: CMS_API) - -- - do - - end - -feature -- Module Management - - install (api: CMS_API) - -- install the module - local - sql_query: STRING - do - -- create the database - if attached api.storage.as_sql_storage as l_sql_storage then - if not l_sql_storage.sql_table_exists ("file_nodes") then - sql := "[ - CREATE TABLE file_nodes( - `nid` INTEGER NOT NULL CHECK("nid">=0), - `type` VARCHAR(255) NOT NULL, - CONSTRAINT unique_id PRIMARY KEY nid - ); - ]" - - l_sql_storage.sql_execute_script (sql, void) - if l_sql_storage.has_error then - api.logger.put_error ("Could not initialize database for file_uploader module", generating_type) - - end - end - Precursor (api) - end - end - -feature -- Hooks - - register_hooks (a_response: CMS_RESPONSE) - -- register the hooks - do - a_response.subscribe_to_menu_system_alter_block(Current) - a_response.subscribe_to_block_hook(Current) - end - - block_list: ITERABLE [like {CMS_BLOCK}.name] - do - -- List of block names, managed by current object. - end - - get_block_view (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE) - do - -- Get block object identified by `a_block_id' and associate with `a_response'. - end - - menu_system_alter (a_menu_system: CMS_MENU_SYSTEM; a_response: CMS_RESPONSE) - local - link: CMS_LOCAL_LINK - do - create link.make ("Files", "/uploaded_files") - a_menu_system.primary_menu.extend (link) - end -end diff --git a/modules/file_upload/cms_file_upload.ecf b/modules/file_upload/file_uploader.ecf similarity index 65% rename from modules/file_upload/cms_file_upload.ecf rename to modules/file_upload/file_uploader.ecf index 1bb98fb..ab71576 100644 --- a/modules/file_upload/cms_file_upload.ecf +++ b/modules/file_upload/file_uploader.ecf @@ -1,6 +1,6 @@ - - + +