diff --git a/__tests__/search.test.ts b/__tests__/search.test.ts
index cbf54ac..e571962 100644
--- a/__tests__/search.test.ts
+++ b/__tests__/search.test.ts
@@ -149,6 +149,17 @@ describe('Search', () => {
     )
   })
 
+  it('Single file search - Absolute Path - Manual directory', async () => {
+    const rootDirectory = path.join(root, 'folder-a')
+    const searchResult = await findFilesToUpload(
+      extraFileInFolderCPath,
+      rootDirectory
+    )
+    expect(searchResult.filesToUpload.length).toEqual(1)
+    expect(searchResult.filesToUpload[0]).toEqual(extraFileInFolderCPath)
+    expect(searchResult.rootDirectory).toEqual(rootDirectory)
+  })
+
   it('Single file search - Relative Path', async () => {
     const relativePath = path.join(
       '__tests__',
diff --git a/action.yml b/action.yml
index 94a583a..6a02d8b 100644
--- a/action.yml
+++ b/action.yml
@@ -23,6 +23,10 @@ inputs:
 
       Minimum 1 day.
       Maximum 90 days unless changed from the repository settings page.
+  root-directory:
+    description: >
+      A file path that denotes the root directory of the files being uploaded.
+      This path is used to strip the provided path(s) to control how they are uploaded and structured
 runs:
   using: 'node16'
   main: 'dist/index.js'
diff --git a/dist/index.js b/dist/index.js
index 1a10574..c4939f9 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -10745,6 +10745,7 @@ var Inputs;
     Inputs["Path"] = "path";
     Inputs["IfNoFilesFound"] = "if-no-files-found";
     Inputs["RetentionDays"] = "retention-days";
+    Inputs["RootDirectory"] = "root-directory";
 })(Inputs = exports.Inputs || (exports.Inputs = {}));
 var NoFileOptions;
 (function (NoFileOptions) {
@@ -10803,6 +10804,7 @@ const constants_1 = __nccwpck_require__(9042);
 function getInputs() {
     const name = core.getInput(constants_1.Inputs.Name);
     const path = core.getInput(constants_1.Inputs.Path, { required: true });
+    const rootDirectory = core.getInput(constants_1.Inputs.RootDirectory);
     const ifNoFilesFound = core.getInput(constants_1.Inputs.IfNoFilesFound);
     const noFileBehavior = constants_1.NoFileOptions[ifNoFilesFound];
     if (!noFileBehavior) {
@@ -10811,7 +10813,8 @@ function getInputs() {
     const inputs = {
         artifactName: name,
         searchPath: path,
-        ifNoFilesFound: noFileBehavior
+        ifNoFilesFound: noFileBehavior,
+        rootDirectory: rootDirectory
     };
     const retentionDaysStr = core.getInput(constants_1.Inputs.RetentionDays);
     if (retentionDaysStr) {
@@ -10931,7 +10934,7 @@ function getMultiPathLCA(searchPaths) {
     }
     return path.join(...commonPaths);
 }
-function findFilesToUpload(searchPath, globOptions) {
+function findFilesToUpload(searchPath, manualRootDirectory, globOptions) {
     return __awaiter(this, void 0, void 0, function* () {
         const searchResults = [];
         const globber = yield glob.create(searchPath, globOptions || getDefaultGlobOptions());
@@ -10963,6 +10966,13 @@ function findFilesToUpload(searchPath, globOptions) {
                 (0, core_1.debug)(`Removing ${searchResult} from rawSearchResults because it is a directory`);
             }
         }
+        // Root directory manually set in inputs
+        if (manualRootDirectory) {
+            return {
+                filesToUpload: searchResults,
+                rootDirectory: manualRootDirectory
+            };
+        }
         // Calculate the root directory for the artifact using the search paths that were utilized
         const searchPaths = globber.getSearchPaths();
         if (searchPaths.length > 1) {
@@ -11042,7 +11052,7 @@ function run() {
     return __awaiter(this, void 0, void 0, function* () {
         try {
             const inputs = (0, input_helper_1.getInputs)();
-            const searchResult = yield (0, search_1.findFilesToUpload)(inputs.searchPath);
+            const searchResult = yield (0, search_1.findFilesToUpload)(inputs.searchPath, inputs.rootDirectory);
             if (searchResult.filesToUpload.length === 0) {
                 // No files were found, different use cases warrant different types of behavior if nothing is found
                 switch (inputs.ifNoFilesFound) {
diff --git a/src/constants.ts b/src/constants.ts
index 9d64a61..0078986 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -3,7 +3,8 @@ export enum Inputs {
   Name = 'name',
   Path = 'path',
   IfNoFilesFound = 'if-no-files-found',
-  RetentionDays = 'retention-days'
+  RetentionDays = 'retention-days',
+  RootDirectory = 'root-directory'
 }
 
 export enum NoFileOptions {
diff --git a/src/input-helper.ts b/src/input-helper.ts
index 8344823..c2d59c4 100644
--- a/src/input-helper.ts
+++ b/src/input-helper.ts
@@ -8,6 +8,7 @@ import {UploadInputs} from './upload-inputs'
 export function getInputs(): UploadInputs {
   const name = core.getInput(Inputs.Name)
   const path = core.getInput(Inputs.Path, {required: true})
+  const rootDirectory = core.getInput(Inputs.RootDirectory)
 
   const ifNoFilesFound = core.getInput(Inputs.IfNoFilesFound)
   const noFileBehavior: NoFileOptions = NoFileOptions[ifNoFilesFound]
@@ -25,7 +26,8 @@ export function getInputs(): UploadInputs {
   const inputs = {
     artifactName: name,
     searchPath: path,
-    ifNoFilesFound: noFileBehavior
+    ifNoFilesFound: noFileBehavior,
+    rootDirectory: rootDirectory
   } as UploadInputs
 
   const retentionDaysStr = core.getInput(Inputs.RetentionDays)
diff --git a/src/search.ts b/src/search.ts
index bd80164..af2d449 100644
--- a/src/search.ts
+++ b/src/search.ts
@@ -80,6 +80,7 @@ function getMultiPathLCA(searchPaths: string[]): string {
 
 export async function findFilesToUpload(
   searchPath: string,
+  manualRootDirectory?: string,
   globOptions?: glob.GlobOptions
 ): Promise<SearchResult> {
   const searchResults: string[] = []
@@ -121,6 +122,14 @@ export async function findFilesToUpload(
     }
   }
 
+  // Root directory manually set in inputs
+  if (manualRootDirectory) {
+    return {
+      filesToUpload: searchResults,
+      rootDirectory: manualRootDirectory
+    }
+  }
+
   // Calculate the root directory for the artifact using the search paths that were utilized
   const searchPaths: string[] = globber.getSearchPaths()
 
diff --git a/src/upload-artifact.ts b/src/upload-artifact.ts
index 44c74bf..65ec55b 100644
--- a/src/upload-artifact.ts
+++ b/src/upload-artifact.ts
@@ -7,7 +7,10 @@ import {NoFileOptions} from './constants'
 async function run(): Promise<void> {
   try {
     const inputs = getInputs()
-    const searchResult = await findFilesToUpload(inputs.searchPath)
+    const searchResult = await findFilesToUpload(
+      inputs.searchPath,
+      inputs.rootDirectory
+    )
     if (searchResult.filesToUpload.length === 0) {
       // No files were found, different use cases warrant different types of behavior if nothing is found
       switch (inputs.ifNoFilesFound) {
diff --git a/src/upload-inputs.ts b/src/upload-inputs.ts
index 37325df..5e5a772 100644
--- a/src/upload-inputs.ts
+++ b/src/upload-inputs.ts
@@ -20,4 +20,9 @@ export interface UploadInputs {
    * Duration after which artifact will expire in days
    */
   retentionDays: number
+
+  /**
+   * A file path that denotes the root directory of the files being uploaded
+   */
+  rootDirectory: string
 }