ajax异步上传图片文件并将其转换为base64格式

高级浏览器上面,可以直接使用html5的FileReader,实现获取上传文件的base64格式,并以字符串形式提交。对于IE9以下的浏览器,就得另想他法。下面是高级浏览器的示例代码。

$(‘.image‘).change(function(e) {
    var target = $(e.target);
    var file;
    if(target[0].files && target[0].files[0] ) {
        file = target[0].files[0];
    }
    if(file) {
        var reader = new FileReader();
        reader.onload = function(evt){
            var imgstr = evt.target.result; //这就是base64字符串
        };
        reader.readAsDataURL(file);
    }
});  

1、ajax异步上传文件

使用了jquery.form插件。该插件的原理,是创建了一个隐藏的iframe,来作为iframe提交文件的跳转地址。将form的target属性设置为该iframe,则返回结果将在iframe中显示。这个过程可以自己实现,也可以借助jquery的form插件实现。下面的代码是借助了插件。
html代码如下。添加了一个按钮,用来做提交测试,也可换为其他触发方式。

<form id="postForm" action= "uploadBack.jsp" method= "post">
  <ul>
    <li>
        <span>img:</span>
        <input id="img" name="img" type="file" accept=".jpg">
    </li>
    <li>
        <a href="javascript:void(0);">提交</a>
    </li>
  </ul>
</form>

js代码如下。成功和失败方法可以自行定义。

$(‘a‘).click(function() {
    var options = {
        dataType: ‘json‘,
        success: getResult,
        error: showError
    }
    $(‘#postForm‘).ajaxSubmit(options);
});

2、服务端接收2进制图片
直接从服务端读取输入流,得到的并不是仅仅是图片流,还夹杂了其他信息。如果获取图片流,需要先将其他信息去掉。下面是代码,可以将获取的图片流输出到本地,存为一张相同的图片。

ServletInputStream  in = request.getInputStream();
int result;
OutputStream out = new FileOutputStream("E:/TEST/2.jpg");
byte[] buffer = new byte[1024];
result = in.readLine(buffer,0,buffer.length); //读取boundary
result = in.readLine(buffer,0,buffer.length); //读取Content-Disposition
result = in.readLine(buffer,0,buffer.length); //读取Content-Type;
result = in.readLine(buffer,0,buffer.length); //读取空行;
int length = -1;
while ((length = in.read(buffer)) != -1) {
    out.write(buffer, 0, length);
}
in.close();
out.close();

3、将2进制图片流转为base64格式字符串
2进制流先存入byte[]数组,然后利用sun.misc.BASE64Encoder包即可转成。将流存入数组时,中途遇到没有读取完整的数据,从而使得得到的字符串不是完整的图片,后又换为循环读取,才得到视觉无损图。另外,得到的base字符串中,可能含有换行等特殊符号,保险起见,处理一下。代码如下,变量接上段代码。

ByteArrayOutputStream outstream = new ByteArrayOutputStream();
byte[] buff = new byte[100]; //buff用于存放循环读取的临时数据
int rc = 0;
while ((rc = in.read(buff, 0, 100)) > 0) {
    outstream.write(buff, 0, rc);
}
byte[] data = outstream.toByteArray();
in.close();
BASE64Encoder encoder = new sun.misc.BASE64Encoder();
String base64str = encoder.encodeBuffer(data).trim();
base64str = base64str.replaceAll("[\\t\\n\\r]", "");

总结一下,感觉脑子长时间不用,就是有点秀逗了,人也懒了,解决问题的周期也变长了,以后还得勤动脑勤动手。另外,谷歌果然比百度好用太多。

时间: 2024-12-29 23:34:10

ajax异步上传图片文件并将其转换为base64格式的相关文章

[Ajax] 使用Ajax异步上传图片文件(非Form表单提交)

通过表单Form提交来上传文件的方式这里就不说了: 下面介绍,通过js中使用ajax异步上传图片文件: 新建一个html页面和一个一般处理程序即可: 涉及思路: //发送2次Ajax请求完成js异步上传文件的操作:          //第1次,post 只上传文件,返回文件名name          //第2次,get 根据文件名name定位服务器上的文件,同时根据浏览器传过来的realname重命名服务器上的文件          //(如果有其他参数,也可以通过第2次一并上传) 图片文件

ajax异步上传图片三种方案

转自:http://www.jb51.net/article/51180.htm 注:自己尝试了前两种,都可用: 目前常用的异步文件上传功能有几种,比较多见的如使用iframe框架形式,ajax功能效果,以及flash+php功能,下面介绍ajax与iframe实现异步文件上传的功能的例子. 方法一,利用jquery ajaxfileupload.js实现文件上传 其实就是实现无刷新式的文件上传.可采用IFRAME文件上传原理.实际上在用PHP上传文件时...只能用$_FILES形式,但是若我

使用Ajax异步上传图片的方法(html,javascript,php)

前两天项目中需要用到异步上传图片和显示上传进度的功能,于是找了很多外国的文章,翻山越岭地去遇上各种坑,这里写篇文章记录一下. HTML <form id="fileupload-form"> <input id="fileupload" type="file" name="file" > </form> HTML代码没什么好说,一个form表单,还有文件类型的input.我们来看js部分.

ajax异步上传图片&amp;SpringMVC后台代码

function uploadPic(){ var options = { url : "/upload/updatePic.action", type : "post", dataType : "json", success : function(data){ $("#allUrl").attr("src", data.url); $("#imgUrl").val(data.url);

将图片转换为base64 格式

1.页面上的图片,转换成base64格式,可以通过canvas 的 toDataURL 例子:给定图片的url 将图片转换为base64 var imageSrc = "../images/0.jpg"; // 图片的URL //@param image:Image 对象,ext:图片的格式(jpg)function getBase64Image(image,ext){ var canvas = document.createElement("canvas"); c

thinkPHP利用ajax异步上传图片并显示、删除

近来学习tp5的过程中,项目中有个发帖功能,选择主题图片.如下: 利用原始的文件上传处理,虽然通过原始js语句能实时显示上传图片,但是这样的话会涉及很多兼容问题.使用ajax技术,实现选择性删除所选图片功能,并不会有兼容问题. 表单文件form: <form method="post" enctype="multipart/form-data"> <div style="margin: 20px 20px 20px 10px;"

jqueryForm 异步上传图片文件

首先是HTML格式: <li> <span>上传:</span> <div class="loginInput"> <div class="fileInput"> <div class="fileBox"> {if $info['certificate']} <img src="{$info['certificate']}" width="

ajax异步下载文件

ajax不支持异步下载,但我想你是不想让地址栏发生跳转,如果是这样的话,我到是有几种方法.这几种方法的原理都是一样的,就是发送同步请求,当同步请求下载东西是并不会改变url <a href="你要下载的资源的url">下载</a> document.href="你要下载的资源的url" var form = $("<form action='你要下载的资源的url' method='post'></form>

js 原生 ajax 异步上传图片

<script type="text/javascript"> function upload() { var file1 = document.getElementById("file1"); postFile(file1.files[0]); } function postFile(data) { //1.创建异步对象(小浏览器) var req = new XMLHttpRequest(); //2.设置参数 req.open("post