2013-08-28 2 views
-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()» без загрузки файла на сервер

+0

Как вы ожидаете получить информацию об изображении, если только это не прочитано сервером? Вероятно, вы хотите, чтобы вы были загружены, но не были сохранены на сервере. –

+0

Если вы хотите сделать это, не сохраняя загруженный файл на сервер, вы должны вручную разобрать данные о нескольких данных, что не является тривиальным. – fardjad

+0

мое требование предлагает сохранить файл на другом сервере, но я хочу, чтобы содержимое байта файла. – user2613027

ответ

0

Вы можете попробовать использовать HTML5:

Создать холст, загрузите изображение в него, а затем использовать toDataURL(), чтобы получить представление base64.

Примечание: Не тестировалось

Edit:

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

+0

Определенно хороший способ, если браузер, используемый вашими посетителями, поддерживает функцию Canvas. Нет обратной совместимости. Тем не менее, самый близкий ответ на то, что ожидает OP! :) –

-1

берется из this ответа следующее:

$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

Она хранит все содержимое памяти. Вы можете ограничить максимальный размер загружаемого файла и т. Д.

+0

@Downvoter, позаботьтесь, чтобы объяснить? – fardjad

+0

Выполнение этих интенсивных вычислений при сохранении всего файла в памяти не будет лучшим способом продвижения вперед, если вы посмотрите на масштабируемость. Попробуйте 100 человек, пытающихся загрузить файлы сразу, то есть 100 изображений в настоящее время находятся в вашей ОЗУ, которые в противном случае могли бы свободно обрабатывать другие запросы от клиентов. (Кроме того, я не являюсь downvoter.) –

+0

@SunnyRGupta ['base64_encode()'] (http://php.net/manual/en/function.base64-encode.php) принимает строку. Поэтому для кодирования загруженного файла с использованием 'base64_encode()' требуется, чтобы напоминающий многостраничный контент сохранялся в памяти (как строка). Это то, что спросил ОП. Я все равно предупредил его/ее. – fardjad

0

Здесь вы идете, несовместимы со старым IE наверняка, а не 100 правильно, так как он не обрабатывает несколько файлов правильно (вам нужны уникальные id-s для img и холст), но ...

<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> 
+0

Не будет работать для всех браузеров, 0 обратная совместимость с браузерами, не поддерживающими CANVAS. –

+0

Я не могу использовать html 5. – user2613027

+0

Ну, хорошо, вы должны указать ограничения в вопросе, который вы задали, чтобы люди не тратили время на непреднамеренные решения. – sanyi

Смежные вопросы