     @db (db) =>
       transaction = db.transaction 'blobs', 'readwrite'
       blobStore = transaction.objectStore 'blobs'
-      request = blobStore.delete file.uid
-      transaction.oncomplete = =>
-        callback false
-      transaction.onerror = (event) =>
-        @handleDbError event
+      keyRange = IDBKeyRange.bound @fileBlockKey(file, 0),
+                                   @fileMaxBlockKey(file)
+      cursor = blobStore.openCursor keyRange, 'next'
+      cursor.onsuccess = (event) =>
+        cursor = event.target.result
+        if cursor and cursor.key
+          request = cursor.delete()
+          request.onsuccess = (event) =>
+            cursor.continue()
+          request.onerror = (event) =>
+            callback true
+        else
+          callback false
+      cursor.onerror = (event) =>
         callback true
 
   # Removes the contents of files whose metadata is missing.

  #   "blobs" table
  fileBlockKey: (file, blockId) ->
    # Padding
    stringId = blockId.toString(36)
    while stringId.length < 8
      stringId = "0" + stringId

    "#{file.uid}-#{stringId}"

  # Retrieves a file's contents from the database.
  #

    callback()
    @

  # The IndexedDB key for a file's block.
  #
  # @param {DropshipFile} file the file that the block belongs to
  # @param {Number} blockId 0-based block sequence number
