uploadFile method
Uploads a file as a release asset to GitHub.
Uploads the specified file to the GitHub release using the provided upload URL. Handles multipart form data upload with proper filename and content type detection. Provides comprehensive error handling and logging for upload operations.
Parameters:
uploadUrl- GitHub release upload URL from APIfile- File instance to upload as release asset
Upload process:
- Extract filename from file path
- Create multipart form data with file content
- Send POST request to upload URL with file data
- Handle success/error responses with logging
Returns browser download URL string if upload successful, null on failure. Download URL can be used to access the uploaded asset directly.
Error handling:
- Network errors: Logged with request details
- API errors: Logged with response message
- File errors: Logged with file information
Implementation
Future<String?> uploadFile(String uploadUrl, File file) async {
final fileName = file.path.split(Platform.pathSeparator).last;
logger.logDebug.call("Uploading file: $fileName to $uploadUrl");
try {
final response = await _dio.post(
uploadUrl,
data: FormData.fromMap({
"file": await MultipartFile.fromFile(file.path, filename: fileName),
}),
queryParameters: {"name": fileName},
);
if (response.statusCode == 201) {
return response.data["browser_download_url"];
}
} on DioException catch (e) {
logger.logErrorVerbose.call("Failed to upload file: $fileName");
if (e.response != null) {
if (e.response?.data is Map<String, dynamic>) {
logger.logErrorVerbose.call(
"Response : ${e.response?.data["message"]}",
);
} else {
logger.logErrorVerbose.call("Response : ${e.response?.data}");
}
} else {
logger.logErrorVerbose.call("Response : ${e.message}");
}
} catch (e) {
logger.logErrorVerbose.call("$e");
}
return null;
}