今天扣丁学堂小编给大家详细介绍一下关于HTML5视频教程微信小程序上传图片功能及后端代码,几乎每个程序都需要用到图片,在小程序中我们可以通过image组件显示图片,当然小程序也是可以上传图片的,微信小程序文档也写的很清楚。下面我们来一起看一下吧。
官方示例代码
wx.chooseImage({
count:1,//默认9
sizeType:['original','compressed'],//可以指定是原图还是压缩图,默认二者都有
sourceType:['album','camera'],//可以指定来源是相册还是相机,默认二者都有
success:function(res){
//返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
vartempFilePaths=res.tempFilePaths
}
})
图片最多可以选择9张,也可以通过拍摄照片实现,当选择完图片之后会获取到图片路径,这个路径在本次启动期间有效。
如果需要保存就需要用wx.saveFile(OBJECT)
通过wx.uploadFile(OBJECT)可以将本地资源文件上传到服务器。
原理就是客户端发起一个HTTPSPOST请求,其中content-type为multipart/form-data。
官方示例代码
wx.chooseImage({
success:function(res){
vartempFilePaths=res.tempFilePaths
wx.uploadFile({
url:'http://example.weixin.qq.com/upload',//仅为示例,非真实的接口地址
filePath:tempFilePaths[0],
name:'file',
formData:{
'user':'test'
},
success:function(res){
vardata=res.data
//dosomething
}
})
}
})
示例代码
看完了官方文档,写一个上传图片就没有那么麻烦了,下面是真实场景的代码
importconstantfrom'../../common/constant';
Page({
data:{
src:"../../image/photo.png",//绑定image组件的src
//略...
},
onLoad:function(options){
//略...
},
uploadPhoto(){
varthat=this;
wx.chooseImage({
count:1,//默认9
sizeType:['compressed'],//可以指定是原图还是压缩图,默认二者都有
sourceType:['album','camera'],//可以指定来源是相册还是相机,默认二者都有
success:function(res){
//返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片
vartempFilePaths=res.tempFilePaths;
upload(that,tempFilePaths);
}
})
}
})
functionupload(page,path){
wx.showToast({
icon:"loading",
title:"正在上传"
}),
wx.uploadFile({
url:constant.SERVER_URL+"/FileUploadServlet",
filePath:path[0],
name:'file',
header:{"Content-Type":"multipart/form-data"},
formData:{
//和服务器约定的token,一般也可以放在header中
'session_token':wx.getStorageSync('session_token')
},
success:function(res){
console.log(res);
if(res.statusCode!=200){
wx.showModal({
title:'提示',
content:'上传失败',
showCancel:false
})
return;
}
vardata=res.data
page.setData({//上传成功修改显示头像
src:path[0]
})
},
fail:function(e){
console.log(e);
wx.showModal({
title:'提示',
content:'上传失败',
showCancel:false
})
},
complete:function(){
wx.hideToast();//隐藏Toast
}
})
}
后端代码
后端是用java写的,一开始的时候,后端开始用了一些框架接收上传的图片,出现了各种问题,后来使用了纯粹的Servlet就没有了问题,把代码贴出来省的以后麻烦了。
注意:代码使用了公司内部的框架,建议修改后再使用
publicclassFileUploadServletextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
privatestaticLoggerlogger=LoggerFactory.getLogger(FileUploadServlet.class);
publicFileUploadServlet(){
super();
}
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
JsonMessagemessage=newJsonMessage();
EOSResponseeosResponse=null;
StringsessionToken=null;
FileItemfile=null;
InputStreamin=null;
ByteArrayOutputStreamswapStream1=null;
try{
request.setCharacterEncoding("UTF-8");
//1、创建一个DiskFileItemFactory工厂
DiskFileItemFactoryfactory=newDiskFileItemFactory();
//2、创建一个文件上传解析器
ServletFileUploadupload=newServletFileUpload(factory);
//解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
//1.得到FileItem的集合items
Listitems=upload.parseRequest(request);
logger.info("items:{}",items.size());
//2.遍历items:
for(FileItemitem:items){
Stringname=item.getFieldName();
logger.info("fieldName:{}",name);
//若是一个一般的表单域,打印信息
if(item.isFormField()){
Stringvalue=item.getString("utf-8");
if("session_token".equals(name)){
sessionToken=value;
}
}else{
if("file".equals(name)){
file=item;
}
}
}
//session校验
if(StringUtils.isEmpty(sessionToken)){
message.setStatus(StatusCodeConstant.SESSION_TOKEN_TIME_OUT);
message.setErrorMsg(StatusCodeConstant.SESSION_TOKEN_TIME_OUT_MSG);
}
StringuserId=RedisUtils.hget(sessionToken,"userId");
logger.info("userId:{}",userId);
if(StringUtils.isEmpty(userId)){
message.setStatus(StatusCodeConstant.SESSION_TOKEN_TIME_OUT);
message.setErrorMsg(StatusCodeConstant.SESSION_TOKEN_TIME_OUT_MSG);
}
//上传文件
if(file==null){
}else{
swapStream1=newByteArrayOutputStream();
in=file.getInputStream();
byte[]buff=newbyte[1024];
intrc=0;
while((rc=in.read(buff))>0){
swapStream1.write(buff,0,rc);
}
Usrusr=newUsr();
usr.setObjectId(Integer.parseInt(userId));
finalbyte[]bytes=swapStream1.toByteArray();
eosResponse=ServerProxy.getSharedInstance().saveHeadPortrait(usr,newRequestOperation(){
@Override
publicvoidaddValueToRequest(EOSRequestrequest){
request.addMedia("head_icon_media",newEOSMediaData(EOSMediaData.MEDIA_TYPE_IMAGE_JPEG,bytes));
}
});
//请求成功的场合
if(eosResponse.getCode()==0){
message.setStatus(ConstantUnit.SUCCESS);
}else{
message.setStatus(String.valueOf(eosResponse.getCode()));
}
}
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
if(swapStream1!=null){
swapStream1.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
try{
if(in!=null){
in.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
PrintWriterout=response.getWriter();
out.write(JSONObject.toJSONString(message));
}
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
doGet(request,response);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多关注扣丁学堂。
网友评论