diff --git a/assignment-client/src/assets/UploadAssetTask.cpp b/assignment-client/src/assets/UploadAssetTask.cpp index e82b99fe99..5ca9b5bbf1 100644 --- a/assignment-client/src/assets/UploadAssetTask.cpp +++ b/assignment-client/src/assets/UploadAssetTask.cpp @@ -58,30 +58,46 @@ void UploadAssetTask::run() { << "is: (" << hexHash << ") "; QFile file { _resourcesDir.filePath(QString(hexHash)) }; + + bool existingCorrectFile = false; if (file.exists()) { - qDebug() << "[WARNING] This file already exists: " << hexHash; + // check if the local file has the correct contents, otherwise we overwrite + if (file.open(QIODevice::ReadOnly) && hashData(file.readAll()) == hash) { + qDebug() << "Not overwriting existing verified file: " << hexHash; - replyPacket->writePrimitive(AssetServerError::NoError); - replyPacket->write(hash); - } else if (file.open(QIODevice::WriteOnly) && file.write(fileData) == qint64(fileSize)) { - qDebug() << "Wrote file" << hash << "to disk. Upload complete"; - file.close(); + existingCorrectFile = true; - replyPacket->writePrimitive(AssetServerError::NoError); - replyPacket->write(hash); - } else { - qWarning() << "Failed to upload or write to file" << hexHash << " - upload failed."; - - // upload has failed - remove the file and return an error - auto removed = file.remove(); - - if (!removed) { - qWarning() << "Removal of failed upload file" << hexHash << "failed."; + replyPacket->writePrimitive(AssetServerError::NoError); + replyPacket->write(hash); + } else { + qDebug() << "Overwriting an existing file whose contents did not match the expected hash: " << hexHash; + file.close(); } - - replyPacket->writePrimitive(AssetServerError::FileOperationFailed); } + + if (!existingCorrectFile) { + if (file.open(QIODevice::WriteOnly) && file.write(fileData) == qint64(fileSize)) { + qDebug() << "Wrote file" << hexHash << "to disk. Upload complete"; + file.close(); + + replyPacket->writePrimitive(AssetServerError::NoError); + replyPacket->write(hash); + } else { + qWarning() << "Failed to upload or write to file" << hexHash << " - upload failed."; + + // upload has failed - remove the file and return an error + auto removed = file.remove(); + + if (!removed) { + qWarning() << "Removal of failed upload file" << hexHash << "failed."; + } + + replyPacket->writePrimitive(AssetServerError::FileOperationFailed); + } + } + + } auto nodeList = DependencyManager::get();