aboutsummaryrefslogtreecommitdiffstats
path: root/Zotlabs/Module/File_upload.php
blob: e991184177bedb6f03d6f0718c056e75c61e3640 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
namespace Zotlabs\Module;

require_once('include/attach.php');
require_once('include/channel.php');
require_once('include/photos.php');


class File_upload extends \Zotlabs\Web\Controller {

	function post() {

		// logger('file upload: ' . print_r($_REQUEST,true));
	
		$channel = (($_REQUEST['channick']) ? channelx_by_nick($_REQUEST['channick']) : null);
	
		if(! $channel) {
			logger('channel not found');
			killme();
		}
	
		$_REQUEST['source'] = 'file_upload';

		if($channel['channel_id'] != local_channel()) {
			$_REQUEST['contact_allow'] = expand_acl($channel['channel_allow_cid']);
			$_REQUEST['group_allow']   = expand_acl($channel['channel_allow_gid']);
			$_REQUEST['contact_deny']  = expand_acl($channel['channel_deny_cid']);
			$_REQUEST['group_deny']    = expand_acl($channel['channel_deny_gid']);
		}

		$_REQUEST['allow_cid'] = perms2str($_REQUEST['contact_allow']);
		$_REQUEST['allow_gid'] = perms2str($_REQUEST['group_allow']);
		$_REQUEST['deny_cid'] = perms2str($_REQUEST['contact_deny']);
		$_REQUEST['deny_gid'] = perms2str($_REQUEST['group_deny']);

		if($_REQUEST['filename']) {
			$r = attach_mkdir($channel, get_observer_hash(), $_REQUEST);
			if($r['success']) {
				$hash = $r['data']['hash'];

				$sync = attach_export_data($channel,$hash);
				if($sync) {
					build_sync_packet($channel['channel_id'],array('file' => array($sync)));
				}
				goaway(z_root() . '/cloud/' . $channel['channel_address'] . '/' . $r['data']['display_path']);

			}
		}
		else {

			$matches = [];
			$partial = false;

			$x = preg_match('/bytes (\d*)\-(\d*)\/(\d*)/',$_SERVER['HTTP_CONTENT_RANGE'],$matches);
			if($x) {
				// logger('Content-Range: ' . print_r($matches,true));
				$partial = true;
			}

			if($partial) {
				$x = save_chunk($channel,$matches[1],$matches[2],$matches[3]);
				if($x['partial']) {
					header('Range: bytes=0-' . (($x['length']) ? $x['length'] - 1 : 0));
					json_return_and_die($result);
				}
				else {
					header('Range: bytes=0-' . (($x['size']) ? $x['size'] - 1 : 0));

					$_FILES['userfile'] = [
						'name'     => $x['name'],
						'type'     => $x['type'],
						'tmp_name' => $x['tmp_name'],
						'error'    => $x['error'],
						'size'     => $x['size']
					];
				}
			}
			else {	
				if(! array_key_exists('userfile',$_FILES)) {
					$_FILES['userfile'] = [
						'name'     => $_FILES['files']['name'],
						'type'     => $_FILES['files']['type'],
						'tmp_name' => $_FILES['files']['tmp_name'],
						'error'    => $_FILES['files']['error'],
						'size'     => $_FILES['files']['size']
					];
				}
			}

			$r = attach_store($channel, get_observer_hash(), '', $_REQUEST);
			if($r['success']) {
				$sync = attach_export_data($channel,$r['data']['hash']);
				if($sync)
					build_sync_packet($channel['channel_id'],array('file' => array($sync)));

			}
		}
		goaway(z_root() . '/' . $_REQUEST['return_url']);
	
	}
	
}