1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11:
12:
13:
14:
15: 16: 17: 18: 19:
20: class NDownloadResponse extends NObject implements IPresenterResponse
21: {
22:
23: private $file;
24:
25:
26: private $contentType;
27:
28:
29: private $name;
30:
31:
32: public $resuming = TRUE;
33:
34:
35: 36: 37: 38: 39:
40: public function __construct($file, $name = NULL, $contentType = NULL)
41: {
42: if (!is_file($file)) {
43: throw new NBadRequestException("File '$file' doesn't exist.");
44: }
45:
46: $this->file = $file;
47: $this->name = $name ? $name : basename($file);
48: $this->contentType = $contentType ? $contentType : 'application/octet-stream';
49: }
50:
51:
52:
53: 54: 55: 56:
57: final public function getFile()
58: {
59: return $this->file;
60: }
61:
62:
63:
64: 65: 66: 67:
68: final public function getName()
69: {
70: return $this->name;
71: }
72:
73:
74:
75: 76: 77: 78:
79: final public function getContentType()
80: {
81: return $this->contentType;
82: }
83:
84:
85:
86: 87: 88: 89:
90: public function send(IHttpRequest $httpRequest, IHttpResponse $httpResponse)
91: {
92: $httpResponse->setContentType($this->contentType);
93: $httpResponse->setHeader('Content-Disposition', 'attachment; filename="' . $this->name . '"');
94:
95: $filesize = $length = filesize($this->file);
96: $handle = fopen($this->file, 'r');
97:
98: if ($this->resuming) {
99: $httpResponse->setHeader('Accept-Ranges', 'bytes');
100: $range = $httpRequest->getHeader('Range');
101: if ($range !== NULL) {
102: $range = substr($range, 6); 103: list($start, $end) = explode('-', $range);
104: if ($start == NULL) {
105: $start = 0;
106: }
107: if ($end == NULL) {
108: $end = $filesize - 1;
109: }
110:
111: if ($start < 0 || $end <= $start || $end > $filesize -1) {
112: $httpResponse->setCode(416); 113: return;
114: }
115:
116: $httpResponse->setCode(206);
117: $httpResponse->setHeader('Content-Range', 'bytes ' . $start . '-' . $end . '/' . $filesize);
118: $length = $end - $start + 1;
119: fseek($handle, $start);
120:
121: } else {
122: $httpResponse->setHeader('Content-Range', 'bytes 0-' . ($filesize - 1) . '/' . $filesize);
123: }
124: }
125:
126: $httpResponse->setHeader('Content-Length', $length);
127: while (!feof($handle)) {
128: echo fread($handle, 4e6);
129: }
130: fclose($handle);
131: }
132:
133: }
134: