帖子
帖子
用户
博客
课程
12下一页
返回列表 发新帖
显示全部楼层
1
帖子
0
勋章
8
Y币

[FAQ] 文件上传 multipart/form-data的问题

[复制链接]
发表于 2015-5-26 10:36:02
使用getPicture和ajax实现文件上传, 服务器端为java的cos解析,要求表单提供enctype= "multipart/form-data"属性,问题是不知道这个属性怎么加到api对象的headers中,下面这种写法服务器端又报错, 求解。
                $(".pic").click(function(){
                        api.getPicture({
                            sourceType: $(this).attr("id"),
                            encodingType: 'jpg',
                            mediaValue: 'pic',
                            destinationType: 'url',
                            allowEdit: true,
                            quality: 50,
                            targetWidth:100,
                            targetHeight:100,
                            saveToPhotoAlbum: false
                        }, function(ret, err){
                            if (ret) {
                                api.alert({msg:JSON.stringify(ret)});
                                api.ajax({
                            url:'http://192.168.0.101:8080/mySchool/app/troop/ImageUpload',
                            method: 'post',
                            headers: {"Content-Type": "multipart/form-data"},
                            files: {image: ret.data}
                    },function(ret,err){
                            if(err) {
                                    api.alert({msg:JSON.stringify(err)});
                            }
                    });
                                
                            } else{
                                api.alert({msg:err.msg});
                            };
                        });                               
                });


1
帖子
0
勋章
8
Y币
apicloud: 通过获取图片控件从相册取文件,另外传了一个普通表单值
        apiready = function() {
                $("#choose").click(function(){
                        api.getPicture({
                                sourceType: 'library',
                            allowEdit: true,
                            quality: 50,
                            targetWidth:100,
                            targetHeight:100                       
            },function(ret,err){
                            if (ret) {
                                //api.alert({msg:ret.data});
                                console.log("文件名: " + ret.data.substring(ret.data.lastIndexOf("/") + 1));
                                api.ajax({
                            url:'http://192.168.0.100:8080/jf/up/test',
                            method: 'post',
                            charset: 'UTF-8',
                            //headers: {"Content-Type": "multipart/form-data; boundary=---------------------------7df2b104b0"},
                            data: {
                                    values: {filename: ret.data.substring(ret.data.lastIndexOf("/") + 1)},
                                    files: {file: ret.data}
                            }
                            
                            //stream: ret.data
                    },function(ret,err){
                            if(ret) {
                                    console.log(JSON.stringify(ret));
                            } else {
                                    console.log(JSON.stringify(err));
                            }
                           
                    });
                  
                  
                            }
            });
                });
               
        }
{"Content-Type": "multipart/form-data"},
这是通用的表单数据啊; 建议 从服务端入手 解决这个问题; 好像java处理表单 确实有些 不一样
28
帖子
1
勋章
1万+
Y币
不用在header里面添加,上传文件时默认就是用的表单方式提交数据
89
帖子
0
勋章
1万+
Y币
楼上正解!
1
帖子
0
勋章
8
Y币
问题已解决, 经反复测试,java这端不能使用cos能处理, 原因是cos只支持multipart/form-data这种处理,而默认的为application/x-www-form-urlencoded, 如果强制指定multipart/form-data异步提交需要加上boundary,但cos无法通过自定义的boundary完成分割读取,改用
commons-fileupload处理正常,感谢开发版主的技术支持,  下面贴出全部代码
1
帖子
0
勋章
8
Y币
java服务器端: 我使用的commons-fileupload-1.3.1.jar和commons-io-2.4.jar这2个版本的jar包

        private void parse4FileUpload() {
        // 获得磁盘文件条目工厂  
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //文件上传路径
        String savePath = PathKit.getWebRootPath() +  "/up/";
        
        /**
         * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tmp
         * 格式的 然后再将其真正写到 对应目录的硬盘上
         */  
        factory.setRepository(new File(savePath +  "/tmp"));  
        // 设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室  
        factory.setSizeThreshold(1024 * 1024);
        // 高水平的API文件上传处理  
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 提交上来的信息都在这个list里面  
        // 这意味着可以上传多个文件  
        // 请自行组织代码  
        List<FileItem> list = null;
        FileItem item = null;
        try {
                this.getRequest().setCharacterEncoding("UTF-8");
                        list = upload.parseRequest(this.getRequest());
                        System.out.println(list.size());
                        for(int i = 0; i < list.size(); i++) {
                                item = list.get(i);
                                //普通表单
                                if(item.isFormField()) {
                                        System.out.println(String.format("属性名:%s,值:%s", item.getFieldName(), item.getString()));
                                } else {
                                        System.out.println(String.format("属性名:%s,文件名:%s,文件大小:%s",
                                                        item.getFieldName(), item.getName(), item.getSize()));
                                        //保存文件
                                        if(item.getSize() > 0 && item.getName() != null) {
                                                try {
                                                        item.write(new File(savePath + item.getName()));
                                                } catch (Exception e) {
                                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                                }
                                        }
                                }
                        }
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
1
帖子
0
勋章
11
Y币
mark一下
13
帖子
0
勋章
164
Y币
并不行啊亲,使用了你的方法,还是报错the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded
4
帖子
0
勋章
30
Y币
兄弟,你的前端js怎么写的,我用了你的代码似乎还是不行。
12下一页
您需要登录后才可以回帖 登录

本版积分规则