Because of the way the HTTP protocol works, the contents of the header - in the reply from the server - are used to determine how to handle the contents of the reply body.
And you are adding headers that tell the browser(or whatever is receiving the reply) to treat the contents as JPG data. All of the contents. So that's what happens. You don't send both the data and some HTML/text to show. Either a page or JPG contents are sent.
If you look at the contents of your downloaded image file it should have "hello" at the end of it.
Update:
If you want to you could use the meta tag to first display a message and then redirect to your download URL. The 2 in the example is the number of seconds to wait before the redirect should happen.
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="2;URL='http://example.com/readfile.php'" />
<title>You will soon be downloading</title>
</head>
<body>
Hello
</body>
</html>
This is the cleanest way. If you don't want to display the message until after the file has finished downloading you can do that as well, but then you'd have to resort to Javascript(AFAIK). And that's a little bit trickier.