{"id":1128,"date":"2008-07-09T03:45:24","date_gmt":"2008-07-09T08:45:24","guid":{"rendered":"http:\/\/www.mrc-productivity.com\/docs\/?page_id=1128"},"modified":"2026-08-12T16:33:28","modified_gmt":"2026-08-12T21:33:28","slug":"upload-files-to-server-via-web-2-0-maintenance-applications","status":"publish","type":"ht_kb","link":"https:\/\/www.mrc-productivity.com\/docs\/knowledge-base\/upload-files-to-server-via-web-2-0-maintenance-applications","title":{"rendered":"Upload Files to Server"},"content":{"rendered":"\n<p class=\"wp-block-ht-blocks-messages wp-block-hb-message wp-block-hb-message--withicon is-style-info\"><em>Click <a href=\"https:\/\/www.mrc-productivity.com\/legacy\/maint\/upload-files-to-server-via-web-2-0-maintenance-applications\">here<\/a> to access legacy documentation for this feature.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One feature of Maintainers is to allow the uploading of files from your client machine to the server. This feature is unique in the fact that it will also add a record to the database, as well as upload the specific file to the server.<\/p>\n\n\n\n<p class=\"wp-block-ht-blocks-messages wp-block-hb-message wp-block-hb-message--withicon is-style-alert\">Multi-file uploading is only available in Bootstrap dictionaries and the following templates: Data List with Web Form and Single Row Web Form.<\/p>\n\n\n\n<h2 id=\"getting-started\" class=\"wp-block-heading\">Getting Started<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To begin, create a Maintenance application as you normally would.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Navigate to <strong>Field Settings<\/strong>.<\/li>\n\n\n\n<li>Change the view dropdown box from &#8220;Basic field attributes&#8221; to <strong>&#8220;Form input attributes&#8221;<\/strong>.<\/li>\n\n\n\n<li>Locate the field that will serve as the File Name for the uploaded file.<\/li>\n\n\n\n<li>Check the box for <strong>&#8220;File Upload&#8221;<\/strong>.<\/li>\n<\/ol>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a83fba4c3bf2&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a83fba4c3bf2\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"\/docs\/vue-images\/FieldSettingsUpload.png\" alt=\"\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Figure 1 &#8211; Setting a field as an upload field in Field Settings.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">After compiling, m-Power will automatically transform this standard input field into an interactive file upload box.<\/p>\n\n\n\n<h2 id=\"app-properties\" class=\"wp-block-heading\">App Properties<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before running the application, let&#8217;s look at the application properties for this program. Scroll to the bottom of the App Properties screen to find these three options.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"\/docs\/vue-images\/uploading2.jpg\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Figure 2 &#8211; Various application properties associated with the file upload functionality.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>File Upload Directory:<\/strong> The location on the m-Power server where the files will be saved. If the specified folder does not exist, m-Power will create it. While you must pick a valid drive, this property supports two substitutions for dynamic uploading:\n<ul class=\"wp-block-list\">\n<li><code>${mpower}<\/code>: Automatically selects the m-Power folder (highly useful for seamless deployment between development and production environments).<\/li>\n\n\n\n<li><code>${FIELD}<\/code>: Replaces &#8220;FIELD&#8221; with the name of an actual field in your app. This allows you to route files to specific directories dynamically based on the form values your end-user selects.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>File Upload Max Size:<\/strong> The maximum allowable file size, in megabytes. If a user selects a file that is too large, they will receive a runtime error prompting them to pick a smaller file. <em>(Default is 100 MB).<\/em><\/li>\n\n\n\n<li><strong>File Upload Auto Rename:<\/strong> Controls the system&#8217;s behavior when a file with the exact same name already exists in the destination directory. You can choose to have m-Power automatically rename the new file (e.g., <code>file.txt<\/code> becomes <code>file(1).txt<\/code>), or you can set it to automatically overwrite the existing file.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Make any necessary changes and click <strong>OK<\/strong> to save.<\/p>\n\n\n\n<h2 id=\"runtime-usage\" class=\"wp-block-heading\">Runtime Usage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When running the application, the standard text input is replaced by a modernized upload interface. This interface supports uploading <strong>multiple files at one time<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At runtime, simply drag and drop your files directly into the upload box, or click the box to browse your local machine.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"\/docs\/vue-images\/FileUploadRuntime.png\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Once selected, the app will place the files into a temporary <strong>staging area<\/strong> (queue).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"\/docs\/vue-images\/FileUploadRuntimeStaged.png\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">While the files are in this staging area, you have the opportunity to review them and remove any incorrect files before confirming the upload.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After submitting the form, all the different filenames are written to the same database field in a single record, separated by a pipe character (<code>|<\/code>).<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a83fba4c44a5&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a83fba4c44a5\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"\/docs\/vue-images\/FileUploadRuntimeList.png\" alt=\"\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Managing Files in Update Mode<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When returning to an existing record in action update mode, you can easily view the previously uploaded files.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"\/docs\/vue-images\/FileUploadRuntimeEdit.png\" alt=\"\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Removing Files:<\/strong> You can choose to remove an existing file by clicking the red <strong>X<\/strong> next to the desired file name.<\/li>\n\n\n\n<li><strong>Adding Files:<\/strong> You can also upload additional files while in this update mode.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">After submitting your changes, the removed filename is deleted from the database record, ultimately breaking the relationship to the file on the server.<\/p>\n\n\n\n<p class=\"wp-block-ht-blocks-messages wp-block-hb-message wp-block-hb-message--withicon is-style-alert\"><strong>Note:<\/strong> Removing a file from the web form does <em>not<\/em> physically delete the file from the m-Power server; it only removes the filename from the database record.<\/p>\n\n\n\n<h2 id=\"error-checking\" class=\"wp-block-heading\"><strong>Error Checking<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">m-Power includes built-in validation to ensure that proper information is being uploaded. Below are the common errors a user might encounter:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>File Name Too Long:<\/strong> The total number of characters in the file name cannot exceed the length of the File Name field in your database. For instance, if you attempt to upload <code>Damaged_goods.jpg<\/code> (17 characters) into a 15-character alpha field, the upload will be rejected. <\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a83fba4c4ac5&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a83fba4c4ac5\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"\/docs\/vue-images\/FileUploadCharError.png\" alt=\"\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Figure 4 &#8211; If a user tries to upload a filename too long, the above error is displayed.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>File Exceeds Maximum Size:<\/strong> If a user tries to upload a file that exceeds the MB limit defined in App Properties, the upload will be blocked.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a83fba4c4ccb&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a83fba4c4ccb\" class=\"wp-block-image size-large wp-lightbox-container\"><img decoding=\"async\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"\/docs\/vue-images\/FileUploadSizeError.png\" alt=\"\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">Figure 5 &#8211; If a user tries to upload a file size too large, the above error is displayed.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Downloading files from the server<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">By default, the upload feature will not automatically include the ability to view or download any uploaded files. However, a developer may use m-Painter&#8217;s smartlink functionality to add a hyperlink to their uploaded file, thus allowing the user to view the uploaded view. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For how to do this, please see <a href=\"https:\/\/www.mrc-productivity.com\/docs\/knowledge-base\/downloading-files\" data-type=\"ht_kb\" data-id=\"14341\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n\n\n\n<h2 id=\"secureFile\" class=\"wp-block-heading\"><strong>Secure File Upload\/Download<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The above setup is the default method of uploading a file through an m-Power maintainer. Using the above method, the uploaded file is potentially available to anyone who knows the full URL of the file&#8217;s location. If there is a need to keep files secure behind m-Power\/Tomcat security, please follow the below instructions.<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<h3 id=\"configuration\" class=\"wp-block-heading\">Configuration<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The required setup is similar for the maintainer to upload a file:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Check the box for <strong>&#8220;File Upload&#8221;<\/strong> in the Field Settings -&gt; <strong>&#8220;Form Input Attributes&#8221;<\/strong>.<\/li>\n\n\n\n<li>Set the App Property -&gt; File Upload Directory to a valid directory. The secured directory of your choosing must be outside of the \/mrcjava context. For example: <code>C:\\SecureUpload<\/code> is a valid directory.<\/li>\n<\/ul>\n<\/div><\/div>\n\n\n\n<h3 id=\"secure-file-download\" class=\"wp-block-heading\">Secure File Download<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To download a secure file, users will still click a link to access and download the file to their local PC. However, with this setup the browser will no longer display the file&#8217;s location via the URL. Instead, a developer will assign an &#8220;output queue&#8221; from the m-Power Interface Messaging and Scheduled Task module to &#8220;hide&#8221; the location to the runtime users. <\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<h4 id=\"output-queue-setup\" class=\"wp-block-heading\">Output Queue Setup<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to Admin -&gt; Messaging and Scheduled Tasks -&gt; Output Folders.<\/li>\n\n\n\n<li>Click &#8220;Add Output Folder&#8221;.<\/li>\n\n\n\n<li>Specify a folder name and specify the location of the secured directory as set in the maintainer&#8217;s app properties (e.g. <code>C:\\SecureUpload<\/code>).<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.mrc-productivity.com\/docs\/vue-images\/outputQueue1.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Figure 6 &#8211; Setting up an Output Folder.<\/figcaption><\/figure>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-ht-blocks-messages wp-block-hb-message wp-block-hb-message--withicon is-style-info\"><strong>Important<\/strong>: If you are uploading to a dynamic directory in within your maintainer&#8217;s &#8220;File Upload Directory&#8221; property (e.g. <code>C:\\SecureUpload\\<strong>${FIELD}<\/strong><\/code>), then this same field substitution needs to be used within the folder path when setting up your Output Folder:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"\/docs\/vue-images\/outputQueue2.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Figure 7 &#8211; Setting up an Output Folder with a dynamic field value.<\/figcaption><\/figure>\n\n\n\n<h4 id=\"download-link-setup\" class=\"wp-block-heading\">Download Link Setup<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">m-Power Developers will build the link to access the secure file in m-Painter. Select the upload file data field. From the right-side element panel, click &#8220;Edit HTML&#8221;. Use the syntax below to construct the appropriate link URL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;div data-filelist=\"row.SFFILENAME?html\" class&gt;\n&lt;a href=\"<code>DATADICTIONARY.M12345s<span style=\"background-color: initial; font-family: inherit; font-size: 12.96px; text-align: initial;\">?downloadbinary=1&amp;filefield=SFFILENAME&amp;f=${file}&amp;queue=SecureUpload&amp;slnk=1&amp;KEYFIELD=${row.KEYFIELD?url}&amp;FIELD=${row.FIELD?url}\"&gt;${file}&lt;\/a&gt;<\/span><\/code>&lt;\/div&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">See the explanation of the parameters below:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>data-filelist=\"row.SFFILENAME?html\"<\/code><\/strong>: Tells m-Power which field to loop through to display the uploaded files. Replace row.SFFILENAME?html with your actual field.<\/li>\n\n\n\n<li><strong><code>DATADICTIONARY.M12345s<\/code><\/strong>: This is the maintainer application (or it can be another app secured against Row Level Security. See <a href=\"#secure-file-row-level-security\" data-type=\"internal\" data-id=\"#secure-file-row-level-security\">below <\/a>for steps on implementing Row Level Security). Replace these values with your appropriate dictionary and application number.<\/li>\n\n\n\n<li><strong><code>downloadbinary=1<\/code><\/strong>: Specifies the secure file logic should be called to return a file, not call an application.<\/li>\n\n\n\n<li><strong><code>filefield=SFFILENAME<\/code><\/strong>: Tells m-Power what field to look at to find the name of the file to download. Please replace SFFILENAME with your actual field.<\/li>\n\n\n\n<li><strong><code>f=${file}<\/code><\/strong>: Specifies the exact filename to download in the URL.<\/li>\n\n\n\n<li><strong><code>queue=SecureUpload<\/code>:<\/strong> Tells m-Power to get the file from the secure location created in the Messaging and Scheduled Tasks Output folder. Replace SecureUpload with whatever Folder Identifier Name was chosen in the <a href=\"#output-queue-setup\" data-type=\"internal\" data-id=\"#output-queue-setup\">Output Queue Setup<\/a> section.<\/li>\n\n\n\n<li><strong><code>slnk=1<\/code><\/strong>: Tells m-Power to only grab data based on the the key passed.<\/li>\n\n\n\n<li><code><strong>KEYFIELD=${row.KEYFIELD?url}<\/strong><\/code> &#8211; Tells m-Power, just like in a normal maintainer app, to only work with a given record. Please replace KEYFIELD with the actual key of your app. If you have more than one, please pass all as separate parameters (i.e.<code>KEYFIELD1=${row.KEYFIELD1?url}&amp;KEYFIELD2=${row.KEYFIELD?url}<\/code>).<\/li>\n\n\n\n<li><code><strong>FIELD=${row.FIELD?url}<\/strong><\/code> &#8211; <strong>Optional<\/strong>. Only required if using a field name within the Output Folder path, as shown in Figure 7.<\/li>\n<\/ul>\n\n\n\n<h4 id=\"rowSec\" class=\"wp-block-heading\">Secure File Row Level Security<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">An added benefit of securing these files behind m-Power security is the ability to also introduce <a rel=\"noreferrer noopener\" href=\"\/docs\/knowledge-base\/row-level-security\" data-type=\"URL\" data-id=\"\/docs\/knowledge-base\/row-level-security\" target=\"_blank\">Row Level Security<\/a> as an additional security level. This will allow a developer to control individual user access to a file based on the key(s) of the record containing the uploaded file name. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two applications will be needed for this setup:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Row Level Security retrieval will be needed to serve as the security agent controlling user access to the record. Follow the <a rel=\"noreferrer noopener\" href=\"\/docs\/knowledge-base\/row-level-security\" data-type=\"URL\" data-id=\"\/docs\/knowledge-base\/row-level-security\" target=\"_blank\">documentation steps<\/a> to secure against the key value(s).<\/li>\n\n\n\n<li>Single Row Retrieval to serve as the application to hold the row level security agent. This is the application that will be used in the <a href=\"#download-link-setup\">download link created above<\/a> instead of the maintainer. <\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">When the download link is clicked by an end user, the parent application will pass the key(s) to the retrieval from step 2. Row level security will be invoked to determine if the user should have access to the record and in turn, the secured file. If row level security allows the user to access the record, the secure file will be downloaded to the user&#8217;s local PC. If the user does not have access to the record, the file will not download.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This document discusses how to use a maintainer applications in order to upload fie attachments to the m-Power server. <\/p>\n","protected":false},"author":1,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"footnotes":""},"ht-kb-category":[252],"ht-kb-tag":[],"class_list":["post-1128","ht_kb","type-ht_kb","status-publish","format-standard","hentry","ht_kb_category-maintainer"],"_links":{"self":[{"href":"https:\/\/www.mrc-productivity.com\/docs\/wp-json\/wp\/v2\/ht-kb\/1128","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mrc-productivity.com\/docs\/wp-json\/wp\/v2\/ht-kb"}],"about":[{"href":"https:\/\/www.mrc-productivity.com\/docs\/wp-json\/wp\/v2\/types\/ht_kb"}],"author":[{"embeddable":true,"href":"https:\/\/www.mrc-productivity.com\/docs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mrc-productivity.com\/docs\/wp-json\/wp\/v2\/comments?post=1128"}],"version-history":[{"count":47,"href":"https:\/\/www.mrc-productivity.com\/docs\/wp-json\/wp\/v2\/ht-kb\/1128\/revisions"}],"predecessor-version":[{"id":15262,"href":"https:\/\/www.mrc-productivity.com\/docs\/wp-json\/wp\/v2\/ht-kb\/1128\/revisions\/15262"}],"wp:attachment":[{"href":"https:\/\/www.mrc-productivity.com\/docs\/wp-json\/wp\/v2\/media?parent=1128"}],"wp:term":[{"taxonomy":"ht_kb_category","embeddable":true,"href":"https:\/\/www.mrc-productivity.com\/docs\/wp-json\/wp\/v2\/ht-kb-category?post=1128"},{"taxonomy":"ht_kb_tag","embeddable":true,"href":"https:\/\/www.mrc-productivity.com\/docs\/wp-json\/wp\/v2\/ht-kb-tag?post=1128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}