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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
<?php
/*
* Copyright 2014 Florian "Bluewind" Pritz <bluewind@server-speed.net>
*
* Licensed under AGPLv3
* (see COPYING for full license text)
*
*/
namespace service;
class files {
static public function history($user)
{
$CI =& get_instance();
$query = array();
$fields = array("id", "filename", "mimetype", "date", "hash", "filesize");
$items = $CI->db->select(implode(',', $fields))
->from('files')
->where('user', $user)
->get()->result_array();
// TODO: split this and provide an array of pastes for a multipaste?
$query = $CI->db->query("
SELECT m.url_id id, sum(f.filesize) filesize, m.date, '' hash, '' mimetype, concat(count(*), ' file(s)') filename
FROM multipaste m
JOIN multipaste_file_map mfm ON m.multipaste_id = mfm.multipaste_id
JOIN files f ON f.id = mfm.file_url_id
WHERE m.user_id = ?
GROUP BY m.url_id
", array($user))->result_array();
$items = array_merge($items, $query);
$total_size = $CI->db->query("
SELECT sum(filesize) sum
FROM (
SELECT DISTINCT hash, filesize
FROM files
WHERE user = ?
) sub
", array($user))->row_array();
$ret["items"] = $items;
$ret["total_size"] = $total_size["sum"];
return $ret;
}
static public function add_file($id, $file, $filename)
{
$CI =& get_instance();
$hash = md5_file($file);
$dir = $CI->mfile->folder($hash);
file_exists($dir) || mkdir ($dir);
$new_path = $CI->mfile->file($hash);
// TODO: make this operation atomic (move to temp name, then to final)
// the source can be a different file system so this might do a copy
move_uploaded_file($file, $new_path);
$CI->mfile->add_file($hash, $id, $filename);
}
static public function verify_uploaded_files($files)
{
$CI =& get_instance();
$errors = array();
foreach ($files as $key => $file) {
$error_message = "";
// getNormalizedFILES() removes any file with error == 4
if ($file['error'] !== UPLOAD_ERR_OK) {
// ERR_OK only for completeness, condition above ignores it
$error_msgs = array(
UPLOAD_ERR_OK => "There is no error, the file uploaded with success",
UPLOAD_ERR_INI_SIZE => "The uploaded file exceeds the upload_max_filesize directive in php.ini",
UPLOAD_ERR_FORM_SIZE => "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
UPLOAD_ERR_PARTIAL => "The uploaded file was only partially uploaded",
UPLOAD_ERR_NO_FILE => "No file was uploaded",
UPLOAD_ERR_NO_TMP_DIR => "Missing a temporary folder",
UPLOAD_ERR_CANT_WRITE => "Failed to write file to disk",
UPLOAD_ERR_EXTENSION => "A PHP extension stopped the file upload",
);
$error_message = "Unknown error.";
if (isset($error_msgs[$file['error']])) {
$error_message = $error_msgs[$file['error']];
} else {
$error_message = "Unknown error code: ".$file['error'].". Please report a bug.";
}
}
$filesize = filesize($file['tmp_name']);
if ($filesize > $CI->config->item('upload_max_size')) {
$error_message = "File too big";
}
if ($error_message != "") {
$errors[] = array(
"filename" => $file["name"],
"formfield" => $file["formfield"],
"message" => $error_message,
);
}
}
return $errors;
}
}
|