将图像转换为字节内容而不上传图像


converting image to byte content without uploading image

我有一个html格式的表单和一个上传文件控制

<form action="action.php" method="post" enctype="multipart/form-data"> 
  <input type="file" name="file">   
  <input type="submit" value="submit"> 
</form>

我想在不将文件上传到服务器的情况下获得图像"base64_encode()"的字节内容

好了,肯定与旧IE不兼容,不是100正确,因为它不能正确处理多个文件(img和画布需要唯一的id-s),但是。。。

<html>
    <body>
    <input type="file" id="files" name="files[]" multiple />
    <output id="list"></output>
<script>
function handleFileSelect(evt) {
    var files = evt.target.files;
    for (var i = 0, f; f = files[i]; i++) 
    {
        if (!f.type.match('image.*')) 
        continue;
    var reader = new FileReader();
    reader.onload = (function(theFile)
    {
        return function(e) {
            var span = document.createElement('span');
            span.innerHTML = ['<img id="ex1" src="', e.target.result, '" title="', escape(theFile.name), '"/>'].join('');
            document.getElementById('list').insertBefore(span, null);
            var img  = document.getElementById("ex1");
            var canvas = document.createElement("canvas");
            canvas.width = img.width;
            canvas.height = img.height;
            var ctx = canvas.getContext("2d");
            ctx.drawImage(img, 0, 0);
            var dataUrl = canvas.toDataURL();
            alert(dataUrl);
            };
        })(f);
        reader.readAsDataURL(f);
    }
}
document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>
    </body>
</html>

您可以尝试使用HTML5:

创建一个画布,将图像加载到其中,然后使用toDataURL()获取base64表示。

注:未测试

编辑:

http://tutorials.jenkov.com/html5-canvas/todataurl.html

以下内容取自此答案:

$raw_data = file_get_contents('php://input');
$boundary = substr($raw_data, 0, strpos($raw_data, "'r'n"));
// Fetch each part
$parts = array_slice(explode($boundary, $raw_data), 1);
$data = array();
$base64_encoded = NULL;
foreach ($parts as $part) {
    // If this is the last part, break
    if ($part == "--'r'n") break; 
    // Separate content from headers
    $part = ltrim($part, "'r'n");
    list($raw_headers, $body) = explode("'r'n'r'n", $part, 2);
    // Parse the headers list
    $raw_headers = explode("'r'n", $raw_headers);
    $headers = array();
    foreach ($raw_headers as $header) {
        list($name, $value) = explode(':', $header);
        $headers[strtolower($name)] = ltrim($value, ' '); 
    } 
    // Parse the Content-Disposition to get the field name, etc.
    if (isset($headers['content-disposition'])) {
        $filename = null;
        preg_match(
            '/^(.+); *name="([^"]+)"(; *filename="([^"]+)")?/', 
            $headers['content-disposition'], 
            $matches
        );
        list(, $type, $name) = $matches;
        isset($matches[4]) and $filename = $matches[4]; 
        // handle your fields here
        switch ($name) {
            // this is a file upload
            case 'userfile':
                 $base64_encoded = base64_encode($body);
                 break;
            // default for all other files is to populate $data
            default: 
                 $data[$name] = substr($body, 0, strlen($body) - 2);
                 break;
        } 
    }
}
echo $base64_encoded;

警告

上面的代码使用substr()来搜索边界,并通过正则表达式获取字段名。

如果你想更有效地做到这一点,你必须实现像Boyer-Moore 这样的快速字符串搜索算法

将整个内容存储在内存中。您可能需要限制最大上传大小等。