本文概述
- 实现
- 在服务器端检索文件
在本文中, 你将学习如何将Base64字符串转换为Blob, 并将其作为文件上传到我们的服务器。这种方法等效于用户将文件拖放到文件输入中时所执行的操作。
实现首先, 我们需要使用Javascript将base64字符串转换为” 文件” , 然后将Base64字符串转换为Blob, 并将其解释为服务器中的File。
【如何使用jQuery将base64图像转换为图像文件并以异步形式上传】我们将使用以下方法将base64字符串转换为blob:
/** * Convert a base64 string in a Blob according to the data and contentType. * * @param b64Data {String} Pure base64 string without contentType * @param contentType {String} the content type of the file i.e (image/jpeg - image/png - text/plain) * @param sliceSize {Int} SliceSize to process the byteCharacters * @see http://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript * @return Blob */function b64toBlob(b64Data, contentType, sliceSize) {contentType = contentType || '';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0;
offset <
byteCharacters.length;
offset += sliceSize) {var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0;
i <
slice.length;
i++) {byteNumbers[i] = slice.charCodeAt(i);
}var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}var blob = new Blob(byteArrays, {type: contentType});
return blob;
}
现在, 由于你根本无法将Blob附加到可见文件输入中, 因此我们需要使用Post请求以异步形式将其添加。我们将使用以下形式:
<
form id="myAwesomeForm" method="post" action="/php-code-that-handles-fileupload.php">
<
input type="text" id="filename" name="filename" />
<
!-- Filename -->
<
input type="submit" id="submitButton" name="submitButton" />
<
!-- Submit -->
<
/form>
提交之前的表单只会发送filename参数, 而不发送任何文件。使用Javascript检索表单并将其作为第一个参数传递给FormData的新实例, 该实例将包含输入到异步表单的文本, 此外, 处理你的Base64字符串以适合b64toblob函数所需的格式(第一个参数仅适用于base64字符串(不包含内容类型, 仅作为数据类型的第二个参数):
// Get the form element withot jQueryvar form = document.getElementById("myAwesomeForm");
var ImageURL = "data:image/gif;
base64, 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";
// Split the base64 string in data and contentTypevar block = ImageURL.split(";
");
// Get the content type of the imagevar contentType = block[0].split(":")[1];
// In this case "image/gif"// get the real base64 content of the filevar realData = http://www.srcmini.com/block[1].split(", ")[1];
// In this case "R0lGODlhPQBEAPeoAJosM...."// Convert it to a blob to uploadvar blob = b64toBlob(realData, contentType);
// Create a FormData and append the file with "image" as parameter namevar formDataToUpload = new FormData(form);
formDataToUpload.append("image", blob);
现在, FormData已经有了一个文件, 你只需要使用jQuery异步提交即可:
/** * The following code should send 2 post parameters: * filename: providen by the text input * image: a file, dinamically added from a base64 string using javascript * * Is up to you how to receive the file in the Server side. */$.ajax({url:"/php-code-that-handles-fileupload.php", data: formDataToUpload, // Add as Data the Previously create formDatatype:"POST", contentType:false, processData:false, cache:false, dataType:"json", // Change this according to your response from the server.error:function(err){console.error(err);
}, success:function(data){console.log(data);
}, complete:function(){console.log("Request finished.");
}});
由你决定如何处理先前的代码, 可以阻止表单的Submit事件, 然后执行代码, 如以下示例所示:
<
!DOCTYPE html>
<
html>
<
head>
<
meta charset="utf-8">
<
title>
Base64 string to a file in form<
/title>
<
/head>
<
body>
<
form id="myAwesomeForm" method="post" action="endpoint.php">
<
input type="text" id="filename" name="filename" />
<
!-- Filename -->
<
input type="submit" id="submitButton" name="submitButton" />
<
!-- Submit -->
<
/form>
<
script>
function b64toBlob(b64Data, contentType, sliceSize) {contentType = contentType || '';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0;
offset <
byteCharacters.length;
offset += sliceSize) {var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0;
i <
slice.length;
i++) {byteNumbers[i] = slice.charCodeAt(i);
}var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}var blob = new Blob(byteArrays, {type: contentType});
return blob;
}$("#myAwesomeForm").submit(function(e){e.preventDefault();
appendFileAndSubmit();
});
function appendFileAndSubmit(){// Get the formvar form = document.getElementById("myAwesomeForm");
var ImageURL = "data:image/gif;
base64, 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";
// Split the base64 string in data and contentTypevar block = ImageURL.split(";
");
// Get the content typevar contentType = block[0].split(":")[1];
// In this case "image/gif"// get the real base64 content of the filevar realData = http://www.srcmini.com/block[1].split(", ")[1];
// In this case "iVBORw0KGg...."// Convert to blobvar blob = b64toBlob(realData, contentType);
// Create a FormData and append the filevar fd = new FormData(form);
fd.append("image", blob);
// Submit Form and upload file$.ajax({url:"endpoint.php", data: fd, // the formData function is available in almost all new browsers.type:"POST", contentType:false, processData:false, cache:false, dataType:"json", // Change this according to your response from the server.error:function(err){console.error(err);
}, success:function(data){console.log(data);
}, complete:function(){console.log("Request finished.");
}});
}<
/script>
<
/body>
<
/html>
在服务器端检索文件由你决定如何在服务器端接收文件, 因为我们不知道你是否在使用PHP, 框架, django或其他语言, 但是, 我们提供了2个PHP示例, 可以帮助你理解我们只是做。
Symfony 2
<
?php// Important to use these statemenets, the json response is optional for our response.use Symfony\Component\HttpFoundation\Request;
public function retrieveAction(Request $request){// retrieve the file with the name given in the form.// do var_dump($request->
files->
all());
if you need to know if the file is being uploaded.$file = $request->
files->
get('image');
$nameInTextInput = $request->
request->
get("filename");
}
纯PHP
// Do something with the gif image$file = $_FILES['image']['tmp_name'];
编码愉快!
推荐阅读
- 如何使用jQuery自动使所有高度相同的div列
- 如何使用(WebKit)CSS自定义浏览器滚动条
- 使用一些技巧来优化你的jQuery代码
- 如何在Laravel 5.4中为Guzzle创建PSR-6文件系统缓存
- jQuery中的事件委托是什么以及如何使用它
- 俗话说换个角度理解TCP的三次握手和四次挥手
- 短视频go研发框架实践
- #导入MD文档图片#信息收集这一篇就够了
- 浅谈 Gossipsub