Your search did not match any results.
File Manager

Azure Client-Side Binding

This demo illustrates how to use the custom file provider to connect the FileManager widget to the Azure Blob Storage on the client side. The Custom File Provider allows you to implement custom APIs to handle file operations (add, delete, rename, etc.). All APIs that implement access to Azure Blob Storage on the client are stored in the azure-file-system.js file. On the server, configure the Shared Access Signature (SAS) to grant access to blobs in the storage.

Copy to CodeSandBox
Apply
Reset
import React from 'react'; import FileManager, { Permissions } from 'devextreme-react/file-manager'; import CustomFileProvider from 'devextreme/ui/file_manager/file_provider/custom'; import { LoadPanel } from 'devextreme-react/load-panel'; const endpointUrl = 'https://js.devexpress.com/Demos/Mvc/api/file-manager-azure-access'; const allowedFileExtensions = []; const loadPanelPosition = { of: '#file-manager' }; class App extends React.Component { constructor() { super(); this.state = { requests: [], loadPanelVisible: true, wrapperClassName: '' }; this.onRequestExecuted = this.onRequestExecuted.bind(this); gateway = new AzureGateway(endpointUrl, this.onRequestExecuted); azure = new AzureFileSystem(gateway); this.fileProvider = new CustomFileProvider({ getItems, createDirectory, renameItem, deleteItem, copyItem, moveItem, uploadFileChunk, downloadItems }); this.checkAzureStatus(); } render() { return ( <div id="wrapper" className={this.state.wrapperClassName}> <LoadPanel visible={this.state.loadPanelVisible} position={loadPanelPosition} /> <div id="widget-area"> <FileManager id="file-manager" fileProvider={this.fileProvider} allowedFileExtensions={allowedFileExtensions}> {/* uncomment the code below to enable file/directory management */} <Permissions create={true} copy={true} move={true} remove={true} rename={true} upload={true} download={true}> </Permissions> </FileManager> <div id="request-panel"> { this.state.requests.map((r, i) => { return <div key={i} className="request-info"> <div className="parameter-info"> <div className="parameter-name">Method:</div> <div className="parameter-value dx-theme-accent-as-text-color">{r.method}</div> </div> <div className="parameter-info"> <div className="parameter-name">Url path:</div> <div className="parameter-value dx-theme-accent-as-text-color">{r.urlPath}</div> </div> <div className="parameter-info"> <div className="parameter-name">Query string:</div> <div className="parameter-value dx-theme-accent-as-text-color">{r.queryString}</div> </div> <br /> </div>; }) } </div> </div> <div id="message-box"> To run the demo locally, specify your Azure storage account name, access key and container name in the web.config file. Refer to the <a href="https://js.devexpress.com/Demos/WidgetsGallery/Demo/FileManager/AzureClientBinding/React/Light/" target="_blank" rel="noopener noreferrer"> https://js.devexpress.com/Demos/WidgetsGallery/Demo/FileManager/AzureClientBinding/React/Light/</a> to see the demo online. </div> </div> ); } checkAzureStatus() { fetch('https://js.devexpress.com/Demos/Mvc/api/file-manager-azure-status?widgetType=fileManager') .then(response => response.json()) .then(result => { const className = result.active ? 'show-widget' : 'show-message'; this.setState({ wrapperClassName: className, loadPanelVisible: false }); }); } onRequestExecuted({ method, urlPath, queryString }) { const request = { method, urlPath, queryString }; this.setState({ requests: [request, ...this.state.requests] }); } } function getItems(pathInfo) { const path = getPath(pathInfo); return azure.getItems(path); } function createDirectory(parentDirectory, name) { const path = getPath(parentDirectory.getFullPathInfo()); return azure.createDirectory(path, name); } function renameItem(item, name) { const path = getPath(item.getFullPathInfo()); return item.isDirectory ? azure.renameDirectory(path, name) : azure.renameFile(path, name); } function deleteItem(item) { const path = getPath(item.getFullPathInfo()); return item.isDirectory ? azure.deleteDirectory(path) : azure.deleteFile(path); } function copyItem(item, destinationDirectory) { const sourcePath = getPath(item.getFullPathInfo()); const destinationDirPath = getPath(destinationDirectory.getFullPathInfo()); const destinationPath = destinationDirPath ? `${destinationDirPath}/${item.name}` : item.name; return item.isDirectory ? azure.copyDirectory(sourcePath, destinationPath) : azure.copyFile(sourcePath, destinationPath); } function moveItem(item, destinationDirectory) { const sourcePath = getPath(item.getFullPathInfo()); const destinationDirPath = getPath(destinationDirectory.getFullPathInfo()); const destinationPath = destinationDirPath ? `${destinationDirPath}/${item.name}` : item.name; return item.isDirectory ? azure.moveDirectory(sourcePath, destinationPath) : azure.moveFile(sourcePath, destinationPath); } function uploadFileChunk(fileData, uploadInfo, destinationDirectory) { let promise = null; if(uploadInfo.chunkIndex === 0) { const path = getPath(destinationDirectory.getFullPathInfo()); const filePath = path ? `${path}/${fileData.name}` : fileData.name; promise = gateway.getUploadAccessUrl(filePath).done(accessUrl => { uploadInfo.customData.accessUrl = accessUrl; }); } else { promise = Promise.resolve(); } promise = promise.then(() => gateway.putBlock(uploadInfo.customData.accessUrl, uploadInfo.chunkIndex, uploadInfo.chunkBlob)); if(uploadInfo.chunkIndex === uploadInfo.chunkCount - 1) { promise = promise.then(() => gateway.putBlockList(uploadInfo.customData.accessUrl, uploadInfo.chunkCount)); } return promise; } function downloadItems(items) { const item = items[0]; const path = getPath(item.getFullPathInfo()); azure.downloadFile(path); } function getPath(pathInfo) { return pathInfo.map(part => part.name).join('/'); } let gateway = null; let azure = null; export default App;
import React from 'react'; import ReactDOM from 'react-dom'; import App from './App.js'; ReactDOM.render( <App />, document.getElementById('app') );
<!DOCTYPE html> <html> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.2.7/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.2.7/css/dx.light.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/19.2.7/css/dx-gantt.min.css" /> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="js/azure-file-system.js"></script> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import('./index.js'); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body> </html>
#widget-area { visibility: hidden; } #message-box { display: none; } .show-widget #widget-area { visibility: visible; } .show-message #widget-area { display: none; } .show-message #message-box { display: block; } #request-panel { min-width: 505px; height: 400px; overflow-x: hidden; overflow-y: auto; padding: 18px; margin-top: 40px; background-color: rgba(191, 191, 191, 0.15); } #request-panel .parameter-info { display: flex; } .request-info .parameter-name { flex: 0 0 100px; } .request-info .parameter-name, .request-info .parameter-value { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
System.config({ transpiler: 'plugin-babel', meta: { }, paths: { 'npm:': 'https://unpkg.com/' }, defaultExtension: 'js', map: { 'react': 'npm:react@16/umd/react.development.js', 'react-dom': 'npm:react-dom@16/umd/react-dom.development.js', 'prop-types': 'npm:prop-types/prop-types.js', 'devextreme': 'npm:devextreme@19.2', 'devextreme-react': 'npm:devextreme-react@19.2', 'jszip': 'npm:jszip@3.1.3/dist/jszip.min.js', 'quill': 'npm:quill@1.3.7/dist/quill.js', 'devexpress-diagram': 'npm:devexpress-diagram@0.1.54', 'devexpress-gantt': 'npm:devexpress-gantt@0.0.29', // SystemJS plugins 'plugin-babel': 'npm:systemjs-plugin-babel@0/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0/systemjs-babel-browser.js' }, packages: { 'devextreme': { defaultExtension: 'js' }, 'devextreme-react': { main: 'index.js' }, }, babelOptions: { sourceMaps: false, stage0: true, react: true } });