Embeddable File Explorer

This document is the functional and technical reference for RestFrontage's File Explorer. It is intended for users, Immersive administrators, and integrators.

Explorer allows you to browse folders and access files from:

  • of the Immersive database (Media.Content) ;
  • a server-managed file (Media.Handle) ;
  • an Azure Blob container mounted on an Immersive folder (Folder.VirtualFolderPath).

1. Access the Explore

The page is available from the RestFrontage server:

/Business/Resources/Explorer

1.1 Default Multi-Root Mode

Without RootFolderIdentifier, the Explorer presents all the Immersive folders that you have ParentIdentifier is void:

https://mon-serveur/Business/Resources/Explorer

These folders appear in the content area and in the Folders. The Entrance Root breadcrumb allows us to return to this overview.

A RootFolderIdentifier absent, null or negative activates this multi-root mode.

1.2 Limit Explorer to a tree

To present only one file and its descendants:

https://mon-serveur/Business/Resources/Explorer?RootFolderIdentifier=131

The server denies browsing to a folder that does not descend from this root.

1.3 Kiosk Display

Kiosk mode hides the usual RestFrontage skin:

https://mon-serveur/Business/Resources/Explorer?Render=Kiosk&RootFolderIdentifier=131

Value Kiosk is not case-sensitive. Any other value retains the usual layout.

2. Understand and use the interface

The interface has five areas:

  1. Command bar : Create, modify, delete, and refresh according to the user's configuration and rights.
  2. Folders —The Immersive and Blob tree on the left side of large screens.
  3. Breadcrumb Trail : The path of the current folder and the arrow button to go back to the parent.
  4. Contents : Subfolder and file maps.
  5. Status : loading, possible error and button to try again.

To navigate:

  • Select a folder in the tree view.
  • Select a folder card.
  • select a stage of the breadcrumb trail;
  • Use the arrow button Move up to reach the parent;
  • Use Root to revert to the multi-root view when no root is imposed.

The standard page configures DownloadOnClick: true : Clicking on a file calls the selection callback and then opens or downloads the file. Recognized images are displayed as thumbnails.

On a screen of 720 px or less, the left panel is folded down. The button Folders opens or closes it. The command bar remains on a single line and can scroll horizontally. At 480 px or less, controls with an icon become more compact. The grid and cards also adjust to the available width.

3. Comprehensive URL Parameter Reference

Parameter Type Required Default Description
RootFolderIdentifier positive integer No none Restricts Explorer to an Immersive folder and its descendants. Without a valid value, enables multi-root mode.
AllowedExtensions repeatable chain No all Filters the displayed files by their extension.
RelativePath Chain No none The initial path to be resolved in the Immersive tree and then optionally in a Blob.
Render Chain No Normal layout Value Kiosk Enables the Kiosk layout.
Token Chain Context-specific Current Session A token used when the caller does not already have a valid Immersive session.

A URL contains only one ?. All of the following parameters are separated by &.

3.1 Filter extensions

The parameter can be repeated:

https://mon-serveur/Business/Resources/Explorer?RootFolderIdentifier=131&AllowedExtensions=.jpg&AllowedExtensions=.png&AllowedExtensions=.pdf

It can also contain a comma-separated list:

AllowedExtensions=.jpg,.png,.pdf

Rules:

  • Case is ignored.
  • the initial point is optional;
  • empty values are ignored;
  • If the setting is absent or empty, all extensions are displayed;
  • the filter is based on the file name;
  • This filter is a display rule, not a security permission.

3.2 Full Resolution of RelativePath

RelativePath can successively cross:

  1. Immersive folders, identified by their ownership Name ;
  2. the internal path of a Blob, from the first folder with a VirtualFolderPath.

The segments are separated by /.

With RootFolderIdentifier

The path starts under the targeted folder. The root name should not be repeated.

Tree structure:

Projets (Identifier=10)
└── Chantier A
    └── MNM Blob (VirtualFolderPath configuré)
        └── 06 PLANS VITRINES
            └── SC01

URL:

https://mon-serveur/Business/Resources/Explorer?RootFolderIdentifier=10&RelativePath=Chantier%20A%2FMNM%20Blob%2F06%20PLANS%20VITRINES%2FSC01

Chantier A and MNM Blob are resolved in Immersive. 06 PLANS VITRINES/SC01 is then solved in the Blob.

If the targeted root is itself the Blob folder, the path contains only the Blob segments:

https://mon-serveur/Business/Resources/Explorer?RootFolderIdentifier=15&RelativePath=06%20PLANS%20VITRINES%2FSC01

Without RootFolderIdentifier

The first segment must be the name of an Immersive folder without a parent. This folder becomes the starting root of the resolution.

https://mon-serveur/Business/Resources/Explorer?RelativePath=MNM%20Blob%2F06%20PLANS%20VITRINES%2FSC01

In this example, MNM Blob must be an Immersive folder with no parent. The remaining segments are resolved in its Blob.

If more than one root folder has the same name, the folder with the smallest Identifier is used. Therefore, it is recommended that you give unique names to the root folders used in a URL.

Path Rules

  • Use / as a separator;
  • Do not provide an absolute URL.
  • Do not use segments . or .. ;
  • encode spaces and special characters in the URL;
  • Immersive folder names are compared in a case-insensitive manner.
  • Blob names and prefixes retain Azure Blob Storage case rules.
  • each segment of an Immersive Folder must correspond to a direct child of the previous segment;
  • as soon as a virtual folder is encountered, all remaining segments belong to the Blob.

It is recommended that you construct the URL with URL and URLSearchParams :

const url = new URL("/Business/Resources/Explorer", window.location.origin);
url.searchParams.set("Render", "Kiosk");
url.searchParams.set("RootFolderIdentifier", "10");
url.searchParams.append("AllowedExtensions", ".pdf");
url.searchParams.append("AllowedExtensions", ".ifc");
url.searchParams.set(
    "RelativePath",
    "Chantier A/MNM Blob/06 PLANS VITRINES/SC01"
);

3.3 Full URL Example

https://mon-serveur/Business/Resources/Explorer?Render=Kiosk&Token=<JETON>&RootFolderIdentifier=15&AllowedExtensions=.jpg&AllowedExtensions=.png&AllowedExtensions=.pdf&AllowedExtensions=.ifc&AllowedExtensions=.riv&RelativePath=sous-repertoire%2Fsous-repertoire-2

4. Authentication and Security

The Explorer's page and APIs are protected by Immersive's global security.

Two contexts are supported:

  • An Immersive session is already active.
  • A token is passed with Token=<JETON>, especially in kiosk mode.

The component automatically passes the token present in the URL of the page:

  • in the header Authorization: Bearer its JSON calls;
  • in media URLs belonging to the same server.

Best practices:

  • use HTTPS;
  • Produce URLs that contain a server-side token.
  • Limit the duration and rights of the token.
  • Never place a real token in an accessible repository, documentation, screenshot, or log.
  • Do not use AllowedExtensions as access control.

4.1 Records Management Rights

Editing relies on the permissions of the secure object Folder :

Permission Flag Value Use in the Explorer
See 1 See the dossier.
Read 3 Read its content.
Modify 5 Change its name and description.
Write 11 Create a subfolder and, in a later evolution, add media.
FullControl 15 Delete a folder and administer all its rights.

Default rights are applied to each Immersive: Reading for Group folder Users organization and full control over its Administrators, global server administrators, domain administrators, and Cerebrate. Folders that existed before this change can be regularized from the RestFrontage default rights audit.

EnableEditing never constitutes an authorization. The server recalculates the capacities returned to the component, controls the opening of each modal, and then re-controls the registration request.

Blob folders remain read-only. Deleting an Immersive folder is denied as long as it contains at least one subfolder or media.

5. Mount an Azure Blob container

A virtual folder is a Folder Immersive VirtualFolderPath contains the root URL of the container:

https://monstockage.blob.core.windows.net/mon-conteneur

Prefixes separated by / are presented as subfolders:

06 PLANS VITRINES/SC01/plan-01.pdf
06 PLANS VITRINES/SC01/plan-02.pdf
06 PLANS VITRINES/SC02/plan-03.pdf

Current Release Terms:

  • The RestFrontage server must be able to reach Azure.
  • the reading and enumeration of the container must be accessible anonymously;
  • VirtualFolderPath Must target the root of the container, not a file.
  • The settings after ?, in particular an SAS, are not kept during the enumeration;
  • Azure tagging is not yet supported: a very large container may require further evolution.

6. Integration into an iframe

<iframe
    src="https://mon-serveur/Business/Resources/Explorer?Render=Kiosk&amp;RootFolderIdentifier=15&amp;AllowedExtensions=.pdf"
    title="Documents du projet"
    loading="lazy"
    allow="fullscreen">
</iframe>

If sandbox is used, authorize as needed:

  • allow-scripts to run the Explorer;
  • allow-same-origin for the authentication context;
  • allow-downloads for downloads;
  • allow-popups to open files in a new tab.

Both the RestFrontage CSP and the parent page's CSP must allow the integration.

7. Comprehensive JavaScript Integration Reference

7.1 Construction

The Explorer is distributed as two standalone files with the paths to the current Rest server as follows:

/css/media-explorer.css
/js/media-explorer.js

For consultation alone, they do not depend on css/site.css, nor js/common.js, jQuery or Bootstrap. The stylesheet must be loaded on the page and the script must be loaded before the code that builds the Explorer.

On the other hand, the edit mode uses the RestFrontage modals and the ShowModal, UpdateData, ShowProcessingModal, HideProcessingModal and showToast of js/common.js. External integration that activates EnableEditing must therefore also take over the layout of modals, Bootstrap and common.js, or provide compatible features.

const explorer = new MediaExplorer(hostElement, options);
await explorer.initialize();

hostElement must be an existing HTML element. The constructor prepares the report; initialize() generates the interface and then loads the data.

Full example:

<link rel="stylesheet" href="/css/site.css">
<link rel="stylesheet" href="/css/media-explorer.css">

<div id="MediaExplorerHost"></div>

<script src="/js/commons.js"></script>
<script src="/js/media-explorer.js"></script>
<script>
    const explorer = new MediaExplorer(
        document.getElementById("MediaExplorerHost"),
        {
            RootFolderIdentifier: 15,
            CurrentFolderIdentifier: 15,
            RelativePath: "06 PLANS VITRINES/SC01",
            AllowedExtensions: [".pdf", ".ifc"],
            ApiBaseUrl: "/api/Explorer",
            DefaultFileIconUrl: "/Content/Common/file.svg",
            DefaultFolderIconUrl: "/Content/Common/folder.svg",
            DownloadOnClick: true,
            EnableEditing: true,
            ExtensionIconUrlBuilder: (extension, media) =>
                extension ? `/Content/Common/${extension.substring(1)}.svg` : null,
            MimeTypeIconUrlBuilder: (mimeType, media) =>
                mimeType ? `/Content/Common/${mimeType.replace("/", "-")}.svg` : null,
            Labels: {
                Up: "Niveau supérieur"
            },
            OnFolderChanged: folder => console.log("Dossier", folder),
            OnMediaClicked: media => console.log("Fichier", media),
            OnMediaDoubleClicked: media => console.log("Double-clic", media),
            OnError: error => console.error(error)
        }
    );

    await explorer.initialize();
</script>

For view-only, both files can be served directly by RestFrontage or copied to the client application's assets. If the client application and the RestFrontage API do not have the same origin, ApiBaseUrl must be an absolute URL, and RestFrontage must allow that origin in its CORS configuration.

7.2 All Options

Option Type Default Description
RootFolderIdentifier number | null null Imposed root. null Enables multi-root mode.
CurrentFolderIdentifier number | null null Initially opened in the absence of RelativePath. It must belong to the imposed root.
RelativePath string | null null Mixed Immersive/Blob initial path. It is resolved once on initial load.
AllowedExtensions string[] [] Visible extensions. An empty array allows everything.
ApiBaseUrl string "/api/Explorer" API route prefix.
DefaultFileIconUrl string "/Content/Common/file.svg" A generic icon used for a file that cannot be previewed or folded.
DefaultFolderIconUrl string "/Content/Common/folder.svg" Folder and tree icon.
ExtensionIconUrlBuilder function | null null Builds an icon from (extension, media). Return a URL or null.
MimeTypeIconUrlBuilder function | null null Builds an icon from (mimeType, media). Return a URL or null.
DownloadOnClick boolean false If true, one click opens the file. Otherwise, the default opening is double-clicked.
EnableEditing boolean false Requests the display of folder commands authorized by the server. Does not grant any rights.
Labels object See below Partial overloading of interface texts.
OnFolderChanged function | null null Receives the folder after successful browsing.
OnMediaClicked function | null null Receives the media after a single click.
OnMediaDoubleClicked function | null null Receives media on double-click when DownloadOnClick is worth false.
OnError function | null null Receives the item Error after the error is displayed in the interface.

The page embedded in the RestFrontage overrides the following defaults:

  • DownloadOnClick: true ;
  • EnableEditing: true ;
  • ExtensionIconUrlBuilder to /Content/Common/{extension}.svg ;
  • MimeTypeIconUrlBuilder to /Content/Common/{mime-type}.svg.

7.3 All wording (Labels)

Labels is a partial overload: only the keys that are provided are replaced.

Key Default Location or situation
Folders "Dossiers" The title of the left panel and the text of the mobile button opening this panel.
Root "Racine" The name of the synthetic root of the multi-root mode.
Up "Remonter" The accessible label and tooltip of the parent arrow button. To replace it, use for example Up: "Niveau supérieur".
Loading "Chargement…" Status bar during a query.
EmptyFolder "Ce dossier est vide." Content area without children or media.
Folder "Dossier" Metadata displayed below a folder card. This key does not control the title Folders.
VirtualFolder "Dossier virtuel" Metadata displayed below a Blob folder card.
Virtual "Virtuel" Metadata added under a file from a Blob.
CreateFolder "Nouveau dossier" Create button in the current folder.
EditFolder "Modifier" Edit current folder button.
DeleteFolder "Supprimer" Delete button for the current folder.
Refresh "Rafraîchir" Button to reload the tree view and the current folder.
EditingUnavailable "Les outils d’édition de l’Explorer ne sont pas disponibles sur cette page." Error when EnableEditing is active without a compatible modal framework.
Retry "Réessayer" Button displayed after a recoverable error.
TreeLoadError "Impossible de charger l’arborescence." Network or generic error while loading the tree.
FolderLoadError "Impossible de charger le contenu du dossier." Network or generic error while loading a folder.
UnauthorizedError "Votre session a expiré ou le jeton est invalide." HTTP 401 response.
ForbiddenError "Vous n’avez pas accès à cette ressource." HTTP 403 response.
NotFoundError "La ressource demandée est introuvable." HTTP 404 response.
UnexpectedError "Une erreur inattendue est survenue." Error with no actionable message.

Example with all keys:

Labels: {
    Folders: "Documents",
    Root: "Tous les espaces",
    Up: "Niveau supérieur",
    Loading: "Chargement en cours…",
    EmptyFolder: "Aucun document disponible.",
    Folder: "Répertoire",
    VirtualFolder: "Répertoire distant",
    Virtual: "Distant",
    CreateFolder: "Créer un répertoire",
    EditFolder: "Renommer",
    DeleteFolder: "Effacer",
    Refresh: "Actualiser",
    EditingUnavailable: "L’édition n’est pas disponible dans cette intégration.",
    Retry: "Recharger",
    TreeLoadError: "L’arborescence ne peut pas être chargée.",
    FolderLoadError: "Le contenu ne peut pas être chargé.",
    UnauthorizedError: "Authentification requise.",
    ForbiddenError: "Accès refusé.",
    NotFoundError: "Élément introuvable.",
    UnexpectedError: "Une erreur est survenue."
}

Navigation graphics and size units are not configurable by Labels in the current version. The Key Up However, configures the accessible name and tooltip of the parent arrow.

7.4 Icon Resolution

For a media, the order of resolution is:

  1. real thumbnail if media.IsImage and media.PreviewUrl are filled in;
  2. result of ExtensionIconUrlBuilder(extension, media) ;
  3. result of MimeTypeIconUrlBuilder(media.ContentType, media) ;
  4. DefaultFileIconUrl.

If the chosen image does not load, DefaultFileIconUrl is tried. If the fallback also fails, the image is hidden. Folders use DefaultFolderIconUrl and then hide the image if that URL fails.

The extension provided to the builder is normalized in lowercase and starts with a period, for example .pdf.

7.5 Click Behavior

Configuration Simple click Double-click
DownloadOnClick: true Select, call OnMediaClicked, then opens DownloadUrl. No additional treatment.
DownloadOnClick: false Select and call OnMediaClicked. Call OnMediaDoubleClicked if it exists; if not, opens DownloadUrl.

Files are opened in a new tab. An iframe with sandbox must therefore allow the necessary downloads or windows.

7.6 All Callbacks

OnFolderChanged(folder)

Called after navigateToFolder() and after a return to the synthetic root. He is not called by the very first initialize().

OnMediaClicked(media)

Called after each simple click, before the eventual automatic opening.

OnMediaDoubleClicked(media)

Called only on double-click when DownloadOnClick is worth false. Its presence replaces the automatic double-click opening.

OnError(error)

Called after the error is displayed. For an HTTP response, error.status Contains, in particular, 401, 403 or 404. For a network error, status may be absent.

7.7 All Supported Public Methods

Method Back Description
initialize() Promise<void> Builds the interface and performs the initial load. To be called once after the constructor.
load() Promise<void> Recharges the current shaft and folder. Also resolves the RelativePath if it has not yet been consumed.
navigateToFolder(folder) Promise<void> Opens a folder from a folder ID or object.
setAllowedExtensions(extensions) Promise<void> Replaces the filter and reloads the current view. [] authorizes everything.
setRootFolder(rootFolderIdentifier) Promise<void> Change the root, reset the navigation and reload. null, 0 or a negative value reactivates multi-root mode.
setSidebarOpen(isOpen) void Opens or closes the responsive panel.
refreshFolder(folderIdentifier) Promise<void> Reloads the tree and opens the requested folder after a mutation. null Returns to the available root. Normally triggered by the refresh partial.
destroy() void Flushes the HTML content from the host. The instance should not be used again without re-initialization.

Examples:

await explorer.load();
await explorer.navigateToFolder(58);
await explorer.navigateToFolder({
    Identifier: 15,
    Path: "06 PLANS VITRINES/SC01",
    IsVirtual: true
});
await explorer.setAllowedExtensions([".jpg", ".png"]);
await explorer.setAllowedExtensions([]);
await explorer.setRootFolder(42);
await explorer.setRootFolder(null);
explorer.setSidebarOpen(true);
explorer.setSidebarOpen(false);
await explorer.refreshFolder(42);
explorer.destroy();

8. Structure of Objects Passed to Callbacks

8.1 Folder Object

Property Type Description
Identifier number | null Object ID Folder. null only for the synthetic root.
Key string Display stable key: Folder:{id}, Virtual:{path} or ExplorerRoot.
Name string Display Name.
Description string | null Description, if any.
ParentIdentifier number | null Parent ID Folder.
Path string | null A relative blob path for a virtual folder.
IsVirtual boolean Specifies a Blob folder.
IsExplorerRoot boolean | undefined Worth true only for the client synthetic root.
CreationDate JSON date or absent Date the file was created.
LastModificationDate JSON date, null or absent Last known change.
HasChildren boolean Indicates the possible presence of subfolders.
HasMedia boolean Indicates the possible presence of media.

8.2 Media Object

Property Type Description
Identifier number Identifier of the Media ; is worth 0 for a virtual file.
Key string Media:{id} or VirtualMedia:{path}.
Name string File name.
Description string | null Description, if any.
ContentType string | null Known MIME type.
Handle string | null Possible server path; should not be used directly by the client.
ParentFolderIdentifier number Record Identifier (Folder) owner or timeline folder.
Size number | null Size in bytes.
CreationDate JSON date Date of creation known.
LastModificationDate JSON date or null Last known change.
Extension string Standardised extension, for example .pdf.
Path string | null The relative blob path for a virtual file.
IsVirtual boolean Specifies a Blob file.
IsImage boolean Indicates a recognized aspect ratio.
CanPreview boolean Indicates that a preview is available.
PreviewUrl string | null Thumbnail or image content URL.
DownloadUrl string | null The opening or download URL.

9. Comprehensive HTTP API Reference

All roads are GET under /api/Explorer and require the same authentication context as the page.

9.1 GET /api/Explorer/GetTree

Loads the Immersive tree.

Query string Type Required Description
RootFolderIdentifier integer No Imposed root. Valueless, loads all trees from a folder without a parent.

JSON response:

{
  "RootFolderIdentifier": 0,
  "Folders": [
    {
      "Identifier": 15,
      "Name": "MNM Blob",
      "ParentIdentifier": null,
      "HasChildren": true
    }
  ]
}

RootFolderIdentifier is worth 0 in the response of the multi-root mode.

9.2 GET /api/Explorer/GetFolderContent

Loads the current file, his parent, his children, his media and his breadcrumb trail.

Query string Type Required Description
RootFolderIdentifier integer No Security/Navigation Root.
FolderIdentifier integer Conditional Current Folder. Can be omitted if RelativePath is provided or if a root is provided.
AllowedExtensions CSV string No Visible extensions. An empty value allows everything.
Path Chain No Internal path to a Blob folder already identified by FolderIdentifier. Used for everyday navigation.
RelativePath Chain No Mixed Immersive/Blob initial path resolved from the explicit root or global roots.

Path and RelativePath have different roles: an integrator must use RelativePath for an initial opening and let the component handle Path while browsing Blob.

Key response properties:

Property Description
RootFolderIdentifier Requested root or 0 in multi-root mode.
IsVirtual Indicates that the current content is from a Blob.
Path Path running in the Blob.
VirtualFolderPath The virtual folder mount URL.
CurrentFolder Current file.
ParentFolder Navigable parent or null.
Children Direct subfolders.
Media Direct files after filtering.
Breadcrumb Stages of the Immersive breadcrumb trail then Blob.
Capabilities.CanCreateFolder Allows the creative to be displayed when EnableEditing is active.
Capabilities.CanEditFolder Allows the change to be displayed when EnableEditing is active.
Capabilities.CanDeleteFolder Allows deletion to be displayed when EnableEditing is active.
RootCapabilities.CanCreateFolder Allows creation in the synthetic root for the current organization.

9.3 GET /api/Explorer/GetBreadcrumb

Route preserved for compatibility. The current component no longer needs it, because GetFolderContent already returns Breadcrumb.

Query string Type Required Description
RootFolderIdentifier integer No Imposed root.
FolderIdentifier integer Yes Current file.
Path Chain No Common Blob Road.

The answer contains { "Items": [...] }.

9.4 GET /api/Explorer/GetContent/{mediaIdentifier}

Streams media or file referenced by Handle.

Route Parameter Type Description
mediaIdentifier integer Immersive Media ID.

Content is read in sequential streams. A physical file supports HTTP range requests.

9.5 GET /api/Explorer/GetVirtualContent

Serves a file that belongs to a virtual folder.

Query string Type Required Default Description
FolderIdentifier integer Yes — Identifier of the file bearing VirtualFolderPath.
Path Chain Yes — The path of the file in the Blob.
Download Boolean No false Adds a layout attachment when the value is true.

The server relays the Blob content via streaming.

9.8 Useful HTTP Codes

Code Usual meaning
200 Query successful.
400 Missing parameter, absolute path, or presence of . / ...
401 Session absent, expired or invalid token.
403 Authenticated but unauthorized identity.
404 Root, folder, path, or file not found; folder outside the imposed root.

10. Troubleshooting

Expired session or invalid token

  • Check for token expiration.
  • verify that the URL contains only one ? ;
  • verify that Token has not been truncated or double-encoded.

Access denied

The account or token does not have the necessary rights. Contact an Immersive administrator.

Resource not found

  • Check RootFolderIdentifier ;
  • Remove the root to control the presence of the folder in multi-root mode.
  • check each Immersive folder name of RelativePath ;
  • with an imposed root, do not repeat his name in RelativePath ;
  • without an imposed root, verify that the first segment is the name of a folder without a parent;
  • Verify the case of Blob segments.
  • Verify that the file or container exists.

Empty Blob folder or missing subfolders

  • Check VirtualFolderPath ;
  • Verify that the URL targets the root of the container.
  • Check anonymous read and enumeration access.
  • Verify that RestFrontage can reach Azure.
  • verify that Blob names use / ;
  • Verify that the Azure result doesn't require a next page that isn't yet managed.

Some files don't appear

  • Check AllowedExtensions ;
  • Remove this setting completely to see everything.
  • Check that the file has the expected extension.

Downloading does not start in an iframe

Check sandbox, allow-downloads, allow-popups, CSP, and browser pop-up blocking.

11. Integration Checklist

  • The multi-root mode or the imposed root corresponds to the need for security and navigation.
  • Names used in RelativePath Match an actual parent/child string.
  • The first segment of RelativePath Refers to a root of an Immersive folder when RootFolderIdentifier is absent.
  • Azure case-sensitive Blob segments.
  • Extensions are specified, or the filter is omitted to show everything.
  • The account or token has the necessary rights.
  • The URL uses a single ?, then &.
  • The path is relative and correctly encoded.
  • The Blob container is reachable, readable, and enumerable.
  • The iframe allows the necessary scripts, openings, and downloads.
  • No real tokens are kept in the source code or documentation.
  • Behavior is verified on desktop and mobile.