add client-side upload