页面发送二进制流文件到后台处理

本文介绍了一种在网页上实现从剪贴板粘贴图片的方法,并提供了详细的JavaScript代码示例,包括对不同浏览器的支持及图片数据的处理过程。
页面
//黏贴图片
function ImgClipBoardData(evt,row){
var position = ($(evt).prev(".menuClass").size()<=0)?'up':'down';
var current_main_body_id = ($(evt).prev(".menuClass").size()<=0)?$(evt).next().attr("mainBodyId"):$(evt).prev(".menuClass").attr("mainBodyId");
var img_data = "";
if(window.clipboardData){//判断浏览器是IE
//判断剪切板中内容是图片还是文字,如果是图片则window.clipboardData.getData("Text")取出值为空;若为文字不为空
if(window.clipboardData.getData("Text")!=null && window.clipboardData.getData("Text")!=""){
//$('#imgClipBoard_'+row).html(window.clipboardData.getData("Text"));
//initWordPase();
}else{
var x = document.getElementById("x");
//$('#imgClipBoard_'+row).html('<img src="https://img-blog.csdnimg.cn/2022010612325733387.png'+x.Base64String+'">');
//$("#img_data").val(x.Base64String);
img_data = x.Base64String;
//alert("1234"+img_data);
formsumit(img_data,position,current_main_body_id,row);

}
}else{
if(evt.clipboardData.getData("Text")==null || evt.clipboardData.getData("Text")==""){
var clipboardData = evt.clipboardData;
var sHtml = "";
for(var i=0; i<clipboardData.items.length; i++){
var item = clipboardData.items[i];
if(item.kind=='file'&&item.type.match(/^image\//i)){
//blob就是剪贴板中的二进制图片数据
var blob = item.getAsFile(),reader = new FileReader();
//定义fileReader读取完数据后的回调
reader.onload=function(){
img_data = event.target.result;//result是base64编码后的图片
//var sHtml='<img src="'+img_data+'">';
//$('#imgClipBoard_'+row).html(sHtml);
}
reader.readAsDataURL(blob);//用fileReader读取二进制图片,完成后会调用上面定义的回调函数

}
}
setTimeout(function(){
formsumit(img_data,position,current_main_body_id,row);
},500);
}else{

}
}
}
//保存图片信息
function formsumit(img_data,position,current_main_body_id,row){alert(img_data)
console.log(img_data);
img_data= img_data.replace("https://img-blog.csdnimg.cn/2022010612325733387.png","");
var num = img_data / 600000;
var str = "{}";
for(var i=1;i<=num;i++){
str["img_data"+i]=img_data.substring((i-1)*600000+1,i*600000);

}
//img_data = window.encodeURI(window.encodeURI(img_data));
console.log(img_data);
var frm = $('#statusForm');
$("#txtArea").val(img_data);
$.ajax({
type: "POST",
url: "SaveImageDataServlet",
data: img_data,
contentType :"multipart/form-data",
processData :false,
success: function (data) {
//$('#new_tweet').html(data);
// $('#txtArea').val('');
},
error: function(jqXHR, textStatus, errorThrown){
// log the error to the console

}

});
}



protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("gbk");
String datasource_main = ApplicationUtil.getDefaultDataSource(request
.getSession().getServletContext());System.out.print("121");
//String server_path = RequestUtil.getRealPath(request, "");
//----获取参数
FileOutputStream fos=new FileOutputStream("d:\\a.png");

BASE64Decoder base64=new BASE64Decoder();
byte[] buffer=base64.decodeBuffer(request.getInputStream());

fos.write(buffer);
fos.flush();
fos.close();
fos=null;
}



对于ie的话, 不支持FileReader的,需要activex控件。
### Element UI 前端上传二进制流文件实现方法 #### 配置 `el-upload` 组件用于上传文件 为了使用 `el-upload` 进行文件上传,需先确保已正确配置并安装好 Element-ui 库[^1]。此组件提供了多种方式来定制化上传行为,包括但不限于自定义请求头、指定上传地址以及处理上传前后的回调函数。 对于上传二进制流文件的需求而言,重点在于设置合适的参数选项: - **action**: 设置服务器接口路径。 - **headers**: 如果有认证或其他HTTP头部信息需要传递给服务端,则在此处添加。 - **onSuccess**, **onError**, 和其他事件钩子: 处理不同阶段的状态变化逻辑。 - **beforeUpload**: 可以用来做额外的数据预处理工作或者验证操作。 下面是一个简单的例子展示如何通过 `el-upload` 发送图片作为二进制流至后端API: ```html <template> <div id="app"> <!-- el-upload 的 action 属性指向了后台接收上传文件的服务 --> <el-upload class="upload-demo" drag action="/api/upload/image" :on-success="handleSuccess" :before-upload="beforeAvatarUpload"> <i class="el-icon-upload"></i> <div class="el-upload__text">将文件拖拽至此区域或点击上传</div> </el-upload> <!-- 显示成功上传的图片 --> <img v-if="imageUrl" :src="imageUrl" style="width: 100px;height: auto;"> </div> </template> <script> export default { data() { return { imageUrl: '' }; }, methods: { handleSuccess(response, file){ this.imageUrl = URL.createObjectURL(file.raw); }, beforeAvatarUpload(file) { const isJPG = file.type === 'image/jpeg'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG) { this.$message.error('仅支持 JPG 格式的图片!'); } if (!isLt2M) { this.$message.error('图片大小不得超过 2MB!'); } return isJPG && isLt2M; } } } </script> ``` 上述代码片段展示了怎样利用 `el-upload` 来发送图像文件,并在前端对其进行初步筛选(如格式和尺寸)。当文件被成功上传之后,会调用 `handleSuccess()` 方法更新视图中的图片链接。 另外值得注意的是,在某些情况下可能还需要考虑跨域资源共享(CORS)等问题;同时也要注意安全性和性能优化方面的要求,例如限制每次允许的最大并发连接数等[^4]。 #### 将二进制流转为 Base64 编码显示于页面中 如果希望直接在浏览器里查看由后端返回来的二进制数据(比如一张图片),可以通过 JavaScript 把 ArrayBuffer 转换成 Base64 字符串形式,进而赋值给 `<img>` 标签的 src 属性完成渲染过程[^3]: ```javascript // 假设 response 是来自 fetch 或 axios 请求得到的结果对象 const arrayBufferToBase64 = (buffer) => { let binary = ''; const bytes = new Uint8Array(buffer); const len = bytes.byteLength; for (let i = 0; i < len; i++) { binary += String.fromCharCode(bytes[i]); } return window.btoa(binary); // 返回 base64 string }; axios.get('/path/to/binary', { responseType: 'arraybuffer' }) .then((response) => { const base64String = arrayBufferToBase64(response.data); document.getElementById('myImage').setAttribute( 'src', `data:image/png;base64,${base64String}` ); }); ``` 这段脚本说明了获取远程资源并通过转换成适合 Web 浏览器使用的格式来进行即时呈现的方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值