xyc
2025-02-21 664db98c9e8595ce4dd636a27f480e3a08b81ff5
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
<?php
/*
 * filesave.php
 * To be used with ext-server_opensave.js for SVG-edit
 *
 * Licensed under the MIT License
 *
 * Copyright(c) 2010 Alexis Deveria
 *
 */
 
function encodeRFC5987ValueChars ($str) {
  // See https://tools.ietf.org/html/rfc5987#section-3.2.1
  // For better readability within headers, add back the characters escaped by rawurlencode but still allowable
  // Although RFC3986 reserves "!" (%21), RFC5987 does not
  return preg_replace_callback('@%(2[1346B]|5E|60|7C)@', function ($matches) {
    return chr('0x' . $matches[1]);
  }, rawurlencode($str));
}
 
require('allowedMimeTypes.php');
 
$mime = (!isset($_POST['mime']) || !in_array($_POST['mime'], $allowedMimeTypesBySuffix)) ? 'image/svg+xml;charset=UTF-8' : $_POST['mime'];
 
if (!isset($_POST['output_svg']) && !isset($_POST['output_img'])) {
  die('post fail');
}
 
$file = '';
 
$suffix = '.' . array_search($mime, $allowedMimeTypesBySuffix);
 
if (isset($_POST['filename']) && strlen($_POST['filename']) > 0) {
  $file = $_POST['filename'] . $suffix;
} else {
  $file = 'image' . $suffix;
}
 
if ($suffix == '.svg') {
  $contents = $_POST['output_svg'];
} else {
  $contents = $_POST['output_img'];
  $pos = (strpos($contents, 'base64,') + 7);
  $contents = base64_decode(substr($contents, $pos));
}
 
header('Cache-Control: public');
header('Content-Description: File Transfer');
 
// See https://tools.ietf.org/html/rfc6266#section-4.1
header("Content-Disposition: attachment; filename*=UTF-8''" . encodeRFC5987ValueChars(
  // preg_replace('@[\\\\/:*?"<>|]@', '', $file) // If we wanted to strip Windows-disallowed characters server-side (but not a security issue, so we can strip client-side instead)
  $file
));
header('Content-Type: ' .  $mime);
header('Content-Transfer-Encoding: binary');
 
echo $contents;
 
?>