起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 103290|回复: 181

[分享] [分享]拍照与图片上传

  [复制链接]

56

主题

370

帖子

963

积分

高级会员

Rank: 4

积分
963
QQ
发表于 2016-4-16 11:38:43 | 显示全部楼层 |阅读模式
本帖最后由 负暄 于 2016-5-15 21:15 编辑

感谢版主梁永飞的悉心指导,也感谢论坛高手们的帖子启发,我在参考SimpleFileStore的基础上,实现了用户头像照片的拍照、上传与显示,现分享如下:
1、拍照
调用手机拍照用的是cordova插件,所以在你需要拍照的页面中,首先要引用如下代码:
require("$UI/system/lib/cordova/cordova");               
require("cordova!cordova-plugin-camera");


然后是调用相机拍照的函数,我是放在button的click事件中进行的:
Model.prototype.takePicBtnClick = function(event){
                if(!navigator.camera){
                        return;
                }
                var self = this;                                
                navigator.camera.getPicture(onLoadImageSuccess, onLoadImageFail, {
                        destinationType:navigator.camera.DestinationType.DATA_URL,
                        allowEdit:true,
                        quality:80,
                        targetWidth:100,
                        targetHeight:100,
                        saveToPhotoAlbum:true
                });
               
                //拍照成功后回调
                function onLoadImageSuccess(imageData){
                        localStorage.setItem("imageData","data:image/jpeg;base64,"+imageData);
                        var smallImage = document.getElementById(self.getIDByXID('image1'));
                        //显示图像
                        smallImage.style.display = 'block';
                        smallImage.src = "data:image/jpeg;base64,"+imageData;                        
                        //图片上传
                        self.uploadPic(imageData);            
                }

                function onLoadImageFail(error){
                        alert(error);
                }

        };        


再然后是图片的上传:
       //调用bass实现图片上传               
        Model.prototype.uploadPic = function(imageData){
        
                //用户信息,用于上传图片后保存图片链接fImage
                var userid = this._UserID;    //this._UserID是自己定义的变量,在页面打开时被初始化
                var userBaasData = this.comp("userBaasData");
                var storeFileName =  "";
                var imageJson = {};

                storeFileName = justep.UUID.createUUID();                           
               
                justep.Baas.sendRequest({
                "url" : "/summer/classes",  //baas目录,请根据自己的配置进行修改
                "action" : "uploadPicfile",
                "async" : false,
                "params" : {
                        "picData" : imageData,
                        "ownerID" : userid,
                        "storeFileName" : storeFileName
                },
                "success" : function(data) {

                        justep.Util.hint("图片上传成功");

                        //修改数据库中的图片链接     这里我的字段名叫fImage,可以根据自己的字段名修改               
                        userBaasData.setFilter("Idfilter", "fID='"+userid+"'");
                        userBaasData.refreshData();        
                        if(userBaasData.getCount()>0){
                                var fImage = '{"ownerID":"'+userid+'","storeFileName":"'+storeFileName+'"}';

                                userBaasData.setValue("fImage", fImage);
                                userBaasData.saveData();
                        }               
                }
            });

        };        


然后是,后台对应的图片上传baas,将图片保存在UI2/myClassmate/uploadfiles目录下,这里可以自己进行调整:
public static JSONObject uploadPicfile(JSONObject params, ActionContext context) throws SQLException, NamingException, IOException {
                        
                         System.out.println("uploadPicfile is running...");
                        
                        String ownerID = params.getString("ownerID");
                        String storeFileName = params.getString("storeFileName");                        
                        String picData = params.getString("picData");   


             String baasPath = Thread.currentThread().getContextClassLoader().getResource("").getPath()  ;
             String docStorePath = baasPath + ".." + File.separator + ".."+ File.separator + "model" +File.separator + "UI2" +File.separator + "myClassmate" +File.separator+"uploadfiles" ;
             File docstoreDir = new File(docStorePath);
                   if(!(docstoreDir.exists() && docstoreDir.isDirectory())){
                          docstoreDir.mkdirs();
                   }                           

            String storePath = docStorePath + File.separator + ownerID;
                 File storeDir = new File(storePath);
                 if(!(storeDir.exists() && storeDir.isDirectory())){
                         storeDir.mkdirs();
                 }      
                 
                System.out.println("后台计算的baasPath的值:"+ baasPath);
           System.out.println("后台计算的docStorePath的值:"+ docStorePath);  
           System.out.println("后台计算的storeDir的值:"+ storeDir);

             BASE64Decoder decoder = new BASE64Decoder();
             try {                  
                     byte[] decodedBytes = decoder.decodeBuffer(picData);

                     String imgFile = storePath + File.separator + storeFileName;
                     FileOutputStream out = new FileOutputStream(imgFile);
                     out.write(decodedBytes);
                     out.close();
                     System.out.println("图片上传成功!");
             } catch (Exception e) {
                     System.out.println("图片上传失败!");
                     e.printStackTrace();
             }
             return null;
     }

评分

参与人数 3威望 +45 收起 理由
不羁的风 + 10 很给力!
wgs7909 + 15 很给力!
Masion + 20

查看全部评分

31

主题

104

帖子

391

积分

中级会员

Rank: 3Rank: 3

积分
391
QQ
发表于 2016-6-1 10:10:48 | 显示全部楼层
这是我测试通过的拍照功能,仅供参考,欢迎交流学习

w.rar

3.07 KB, 下载次数: 2933

YmfJava.rar

937 Bytes, 下载次数: 2345

回复 支持 2 反对 0

使用道具 举报

56

主题

370

帖子

963

积分

高级会员

Rank: 4

积分
963
QQ
 楼主| 发表于 2016-4-16 15:46:22 | 显示全部楼层
本帖最后由 负暄 于 2016-5-26 16:03 编辑

2 选择照片
选择照片只能从相册中选,跟拍照比,只是在调用corvoda插件是,一个参数不同。
       //选择照片
        Model.prototype.selPicBtnClick = function(event){
                if(!navigator.camera){
                                return;
                }
                var self = this;                                
               
           navigator.camera.getPicture(onSuccess, onFail, {
                  mediaType : 0,//只选择图片
                  quality:80,
                  allowEdit:true,
                  targetWidth:100,
                  targetHeight:100,                 
              destinationType: navigator.camera.DestinationType.DATA_URL,                            sourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY
              //sourceType: navigator.camera.PictureSourceType.PhotoAlbum//在安卓中,这个参数会跳出拍照界面
           });
        
           function onSuccess(imageData) {
              var smallImage = document.getElementById(self.getIDByXID('image1'));
              smallImage.style.display = 'block';
              smallImage.src = "data:image/jpeg;base64,"+imageData;
              
             //图片上传
             self.uploadPic(imageData);         
           }
        
           function onFail(message) {
              alert('Failed because: ' + message);
           }        

        };

3 照片显示
页面被刷新时,照片要根据数据库中的链接,显示在图片的位置,参考外卖的案例,我在数据库中是这样保存fImage字段的:
{"ownerID":"U01","storeFileName":"C708594A6EE00001F11723001E2011CF"}
记录这张图片的主人ownerID,和名字stroreFileName,主人用来作为存储目录,名字就是一个没有后缀名的文件。
要把这些信息解析成后台对应的文件,就需要另外定义一个函数:

       //显示用户头像,自定义
        Model.prototype.transUrl = function(fImage) {
        
                if(!fImage)
                        return null;

                 this.actionUrl = "/baas/summer/classes/browsePicfile";        
                var src = null;                                
                if (fImage !== null && fImage !== "" && fImage !== "[]") {
                        var imageJson = eval("("+fImage+")");
                        var storeFileName = imageJson.storeFileName;
                        var ownerID = imageJson.ownerID;                       
                        var url = this.actionUrl + '?storeFileName=' + storeFileName + '&ownerID=' + ownerID ;
                        src = require.toUrl(url);
                }

                return src;
        };        

定义该函数后,将想要显示图片的image空间的属性 bind-attr-src 设为如下值:

$model.transUrl(userData.val('fImage'))
其中userData的字段fImage就是存有{"ownerID":"U01","storeFileName":"C708594A6EE00001F11723001E2011CF"}这样内容的字段。


显示图片调用的对后台baas如下:
        //显示图片文件
        private static final int BUFFER_SIZE = 32768 * 8;        
        public static JSONObject browsePicfile(JSONObject params, ActionContext context) throws SQLException, NamingException, IOException {
               
                 System.out.println("browsePicfile is running...");
                 HttpServletRequest request = (HttpServletRequest)context.get(ActionContext.REQUEST);
                 HttpServletResponse response = (HttpServletResponse)context.get(ActionContext.RESPONSE);

                 String baasPath = Thread.currentThread().getContextClassLoader().getResource("").getPath() ;
                 String docStorePath = baasPath + ".." + File.separator + ".."+ File.separator + "model" +File.separator + "UI2" +File.separator + "myClassmate" +File.separator+"uploadfiles" ;

                 String ownerID = request.getParameter("ownerID");
                 String storeFileName = request.getParameter("storeFileName");
                        
                File file = new File(docStorePath + File.separator +ownerID + File.separator + storeFileName);
                FileInputStream fis = new FileInputStream(file);
        
                        response.setHeader("Cache-Control", "pre-check=0, post-check=0, max-age=0");                        
                        String fileNameKey = "filename";               
                        response.addHeader("Content-Disposition", "inline; "+fileNameKey+"=\"" + storeFileName + "\"");
                        
                        OutputStream os = response.getOutputStream();
                byte[] buffer = new byte[BUFFER_SIZE];
                try {
                    int read;
                    while ((read = fis.read(buffer)) != -1) {
                            os.write(buffer, 0, read);
                    }
                } finally {
                    fis.close();
                }
                return null;
        }


OK!以上代码经过打包模式1,和打包模式3的测试,均可正常执行,欢迎大家改写成自己的更强版本。

回复 支持 2 反对 0

使用道具 举报

7

主题

30

帖子

78

积分

初级会员

Rank: 2

积分
78
QQ
发表于 2016-4-19 14:13:40 | 显示全部楼层
论坛的管理真心很负责。楼主的分享精神更值得点赞。

点评

版主也好还是技术人员也好,总会及时出现,帮大家解决问题,真心不错。  发表于 2019-5-7 12:51
确实负责!! www.guaguaxs.com/book/2/2916/ 神雕之颠鸾倒凤  发表于 2017-3-18 19:16
回复 支持 1 反对 0

使用道具 举报

12

主题

2627

帖子

2866

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2866
发表于 2016-4-16 11:52:16 | 显示全部楼层
回复

使用道具 举报

73

主题

345

帖子

1695

积分

金牌会员

Rank: 6Rank: 6

积分
1695
QQ
发表于 2016-4-18 23:06:48 | 显示全部楼层
膜拜
回复

使用道具 举报

718

主题

2841

帖子

5657

积分

论坛元老

Rank: 8Rank: 8

积分
5657
QQ
发表于 2016-4-18 23:13:11 | 显示全部楼层
WEX5初学者,欢迎初学者交流
QQ:597558229
tel:15857336322
回复

使用道具 举报

59

主题

191

帖子

355

积分

中级会员

Rank: 3Rank: 3

积分
355
QQ
发表于 2016-4-19 14:10:05 | 显示全部楼层
楼主,我按照你的方法可以上传,但是显示图片的时候需要怎么处理?
回复 支持 反对

使用道具 举报

56

主题

370

帖子

963

积分

高级会员

Rank: 4

积分
963
QQ
 楼主| 发表于 2016-4-19 18:14:12 | 显示全部楼层
lgz123 发表于 2016-4-19 14:10
楼主,我按照你的方法可以上传,但是显示图片的时候需要怎么处理?

第三部分就是讲显示的。
回复 支持 反对

使用道具 举报

16

主题

118

帖子

265

积分

中级会员

Rank: 3Rank: 3

积分
265
QQ
发表于 2016-4-21 13:03:04 | 显示全部楼层
回复

使用道具 举报

16

主题

118

帖子

265

积分

中级会员

Rank: 3Rank: 3

积分
265
QQ
发表于 2016-4-22 19:40:20 | 显示全部楼层
本帖最后由 1697380236 于 2016-4-22 21:58 编辑

我现在在确定导入什么啊!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-11-23 16:03 , Processed in 0.059663 second(s), 28 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表