2013-08-28 82 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

除非服務器讀取圖像,否則您如何獲得有關圖像的任何信息?您可能意思是您希望將其上傳但不保存到服務器。 – 2013-08-28 11:39:02

+0

如果你想這樣做,但不保存上傳文件到服務器,則必須手動解析多數據,是不平凡的。 – fardjad

+0

我的要求建議將文件存儲到不同的服務器,但我想要的文件的字節內容。 – user2613027

回答

0

您可以嘗試使用HTML5:

創建一個畫布,你的圖像加載到它,然後用toDataURL()來獲取Base64表示。

注:未測試

編輯:

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

+0

絕對是一個好方法,如果瀏覽器訪問者使用了支持畫布功能。沒有向後兼容性。沒有那麼最接近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個圖像駐留在您的RAM中,否則這些圖像可以自由處理來自客戶端的其他請求。 (另外,我不是downvoter。) –

+0

@SunnyRGupta [''base64_encode()'](http://php.net/manual/en/function.base64-encode.php)需要一個字符串。因此,使用'BASE64_ENCODE()編碼上傳的文件'需要將存儲在存儲器中的相似多部分內容(如串)。這就是OP要求的。反正我警告過他/她。 – 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