читай заголовки и ищи
Content-Disposition
Заголовки парсить вручную, добавив их в вывод curl_setopt($ch, CURLOPT_HEADER, 1);
заголовки в текстовом виде, по строке на заголовок (разделитель \r\n), между именем и значением разделитель ': '
p.s. если content-disposition нет, то имя файла исторически берут из url, отсекая все до конца начиная с ? и до первого '/' если читать с конца (никто не гарантирует что там будет желаемое в принципе)