smart upload with hash check