> ## Documentation Index
> Fetch the complete documentation index at: https://e2b-mintlify-changelog-1777288200.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Upload data to sandbox

You can upload data to the sandbox using the `files.write()` method.

## Upload single file

<CodeGroup>
  ```js JavaScript & TypeScript theme={null}
  import fs from 'fs'
  import { Sandbox } from 'e2b'

  const sandbox = await Sandbox.create()

  // Read file from local filesystem
  const content = fs.readFileSync('/local/path')
  // Upload file to sandbox
  await sandbox.files.write('/path/in/sandbox', content)
  ```

  ```python Python theme={null}
  from e2b import Sandbox

  sandbox = Sandbox.create()

  # Read file from local filesystem
  with open("path/to/local/file", "rb") as file:
    # Upload file to sandbox
    sandbox.files.write("/path/in/sandbox", file)
  ```
</CodeGroup>

## Upload with pre-signed URL

Sometimes, you may want to let users from unauthorized environments, like a browser, upload files to the sandbox.
For this use case, you can use pre-signed URLs to let users upload files securely.

All you need to do is create a sandbox with the `secure: true` option. An upload URL will then be generated with a signature that allows only authorized users to upload files.
You can optionally set an expiration time for the URL so that it will be valid only for a limited time.

<CodeGroup>
  ```js JavaScript & TypeScript theme={null}
  import { Sandbox } from 'e2b'

  // Start a secured sandbox (all operations must be authorized by default)
  const sandbox = await Sandbox.create(template, { secure: true })

  // Create a pre-signed URL for file upload with a 10 second expiration
  const publicUploadUrl = await sandbox.uploadUrl(
    'demo.txt', {
      useSignatureExpiration: 10_000, // optional
    },
  )

  // Upload a file with a pre-signed URL (this can be used in any environment, such as a browser)
  const form = new FormData()
  form.append('file', 'file content')

  await fetch(publicUploadUrl, { method: 'POST', body: form })

  // File is now available in the sandbox and you can read it
  const content = sandbox.files.read('/path/in/sandbox')
  ```

  ```python Python theme={null}
  from e2b import Sandbox
  import requests

  # Start a secured sandbox (all operations must be authorized by default)
  sandbox = Sandbox.create(timeout=12_000, secure=True)

  # Create a pre-signed URL for file upload with a 10 second expiration
  signed_url = sandbox.upload_url(path="demo.txt", user="user", use_signature_expiration=10_000)

  form_data = {"file":"file content"}
  requests.post(signed_url, data=form_data)

  # File is now available in the sandbox and you can read it
  content = sandbox.files.read('/path/in/sandbox')
  ```
</CodeGroup>

## Upload directory / multiple files

<CodeGroup>
  ```js JavaScript & TypeScript theme={null}
  import { Sandbox } from 'e2b'

  const sandbox = await Sandbox.create()

  // Read all files in the directory and store their paths and contents in an array
  const readDirectoryFiles = (directoryPath) => {
    // Read all files in the local directory
    const files = fs.readdirSync(directoryPath);

    // Map files to objects with path and data
    const filesArray = files
      .filter(file => {
        const fullPath = path.join(directoryPath, file);
        // Skip if it's a directory
        return fs.statSync(fullPath).isFile();
      })
      .map(file => {
        const filePath = path.join(directoryPath, file);
      
        // Read the content of each file
        return {
          path: filePath,
          data: fs.readFileSync(filePath, 'utf8')
        };
      });

    return filesArray;
  };

  // Usage example
  const files = readDirectoryFiles('/local/dir');
  console.log(files); 
  // [
  //   { path: '/local/dir/file1.txt', data: 'File 1 contents...' },
  //   { path: '/local/dir/file2.txt', data: 'File 2 contents...' },
  //   ...
  // ]

  await sandbox.files.write(files)
  ```

  ```python Python theme={null}
  import os
  from e2b import Sandbox

  sandbox = Sandbox.create()

  def read_directory_files(directory_path):
      files = []
      
      # Iterate through all files in the directory
      for filename in os.listdir(directory_path):
          file_path = os.path.join(directory_path, filename)
          
          # Skip if it's a directory
          if os.path.isfile(file_path):
              # Read file contents in binary mode
              with open(file_path, "rb") as file:
                  files.append({
                      'path': file_path,
                      'data': file.read()
                  })
      
      return files

  files = read_directory_files("/local/dir")
  print(files)
  # [
  #  {"path": "/local/dir/file1.txt", "data": "File 1 contents..." },
  #   { "path": "/local/dir/file2.txt", "data": "File 2 contents..." },
  #   ...
  # ]

  sandbox.files.write_files(files)
  ```
</CodeGroup>
