From d45c116c568cf2e17e398628f6888d1a8488dd1d Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Tue, 8 Oct 2024 23:25:03 +0900 Subject: [PATCH] Patch exec_json() and related functions to support file uploads --- common/js/xml_handler.js | 15 ++++++++++++--- common/js/xml_js_filter.js | 26 +++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/common/js/xml_handler.js b/common/js/xml_handler.js index c69bd0f4f..89cfbeb78 100644 --- a/common/js/xml_handler.js +++ b/common/js/xml_handler.js @@ -215,7 +215,12 @@ var action_parts = action.split('.'); var request_info; if (action === 'raw') { - request_info = 'RAW FORM SUBMISSION'; + if (params instanceof FormData) { + request_info = params.get('module') + '.' + params.get('act'); + } else { + request_info = 'RAW FORM SUBMISSION'; + } + console.log(request_info); } else { params = params ? ($.isArray(params) ? arr2obj(params) : params) : {}; //if (action_parts.length != 2) return; @@ -342,7 +347,7 @@ // Send the AJAX request. try { - $.ajax({ + var args = { type: "POST", dataType: "json", url: url, @@ -351,7 +356,11 @@ headers : headers, success : successHandler, error : errorHandler - }); + }; + if (params instanceof FormData) { + args.contentType = false; + } + $.ajax(args); } catch(e) { alert(e); return; diff --git a/common/js/xml_js_filter.js b/common/js/xml_js_filter.js index 3c16bf8b1..414c175d8 100644 --- a/common/js/xml_js_filter.js +++ b/common/js/xml_js_filter.js @@ -415,6 +415,7 @@ function legacy_filter(filter_name, form, module, act, callback, responses, conf args[0] = filter_name; args[1] = function(f) { + var hasFile = false; var params = {}, res = [], elms = f.elements, data = $(f).serializeArray(); $.each(data, function(i, field) { var v = $.trim(field.value), n = field.name; @@ -435,11 +436,20 @@ function legacy_filter(filter_name, form, module, act, callback, responses, conf } }); + $(f).find('input[type=file][name^=extra_vars]').each(function() { + if (this.files && this.files[0]) { + params[this.name] = this.files[0]; + hasFile = true; + } + }); + if (confirm_msg && !confirm(confirm_msg)) return false; - //exec_xml(module, act, params, callback, responses, params, form); + params['module'] = module; + params['act'] = act; params['_rx_ajax_compat'] = 'XMLRPC'; - exec_json(module + '.' + act, params, function(result) { + + var callback_wrapper = function(result) { if (!result) { result = {}; } @@ -454,7 +464,17 @@ function legacy_filter(filter_name, form, module, act, callback, responses, conf }); callback(filtered_result, responses, params, form); } - }); + }; + + if (!hasFile) { + exec_json(module + '.' + act, params, callback_wrapper); + } else { + var fd = new FormData(); + for (let key in params) { + fd.append(key, params[key]); + } + exec_json('raw', fd, callback_wrapper); + } }; v.cast('ADD_CALLBACK', args);