1. зачем читать из урла, тем более blob:, который живет исключительно в браузере, когда есть Blob.arrayBuffer()
2. а вот преобразовывать полученный ArrayBuffer в base64 нужно будет самостоятельно, т.к. btoa() не принимает ArrayBuffer напрямую, так что или правильно конвертировать его в строку и скармливать btoa(), или найти/написать преобразовалку из ArrayBuffer в base64, но ИМХО проще таки форму отослать
а зачем её завершать? после закрытия клиента (без выхода из сессии) оно должно продолжать работать
по крайней мере у меня в таком режиме нормально работает десятка, правда на обычном компе, а не на виртуалке, но без монитора и прочих клавомышек