最近遇到一个挺难的问题,通过Ajax发送Post请求,从服务器读取图片后,通过response的输出流输出,虽然已经正确地获取了图片,也已获得了输出流,但是在通过Ajax展示的时候没能正确的展现
OutputStream outstr = response.getOutputStream();
BufferedOutputStream bufferOut = new BufferedOutputStream(outstr);
InputStream inStr = dao.readFile(savePath + imagePath, 0);
BufferedInputStream bufferIn = new BufferedInputStream(inStr);
byte[] buffer = new byte[4096];
int size = bufferIn.read(buffer);
while(size != -1){
bufferOut.write(buffer, 0, size);
size = bufferIn.read(buffer);
}
System.out.println("read files pass");
bufferIn.close();
bufferOut.flush();
bufferOut.close();
function showImages(){
var filePath = $("#imagePath").val();
$.ajax({type: "post", //使用post方法访问后台
dataType: "text", //返回text格式的数据,(这里存在疑问,Java部分是response输出流,这里应该指定什么样的数据类型)
url: http+"select.pic", //要访问的后台地址,这里是servlet的地址
data:{"filePath":filePath}, //要发送的数据
success: function(data){//data为返回的数据,在这里做数据绑定
$("#images").attr("src", "data:image/gif;base64," + data);
alert("complete!");
});
}
由 $("#images").attr("src", "data:image/gif;base64," + data); 可知
data 应该是 base64 编码后的数据
所以 dataType: "text" 是正确的
对 java 不是很熟悉,但
bufferOut.write(buffer, 0, size);
显然是直接输出了图片数据,那么 base64 编码在哪里进行呢?
System.out.println("read files pass");
又把一个字符串附加在输出中,这难道不会影响到图片的解析吗?
<?php
if($_POST) {
echo base64_encode(file_get_contents('../'.$_POST['img'])); //读取图片数据并作base64编码
exit;
}
?>
<img id='images' src=''>
<script src=/scripts/jquery-1.8.3.min.js></script>
<script>
$(function() {
$.post('<?=$_SERVER['PHP_SELF']?>', {img:'03.gif'}, function(data) {
$("#images").attr("src", "data:image/gif;base64," + data);
});
});
</script>
虽然语言不同,但是原理是一样的