-1

我有一个 html 表单和一个上传文件控件

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

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

4

3 回答 3

0

给你,肯定不兼容较旧的 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>
于 2013-08-28T12:18:14.117 回答
0

您可以尝试使用 HTML5 :

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

注:未测试

编辑:

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

于 2013-08-28T11:57:20.930 回答
-1

以下内容来自答案:

$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

它将全部内容存储在内存中。您可能想要限制最大上传大小等。

于 2013-08-28T11:58:00.620 回答