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