Skip to content
This repository has been archived by the owner on Aug 22, 2022. It is now read-only.

webuploader IE和FF浏览器下。 form表单提交获取文件信息问题 #276

Closed
hyan5300 opened this issue Jul 3, 2014 · 8 comments
Closed

Comments

@hyan5300
Copy link

hyan5300 commented Jul 3, 2014

前端就是如此 。 加了一个form 和enctype

单次最多可选30张

0%

后台
request.setCharacterEncoding("utf-8"); //设置编码

    DiskFileItemFactory factory = new DiskFileItemFactory();
    String path = request.getRealPath("/upload");
    factory.setRepository(new File(path));
    //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
    factory.setSizeThreshold(1024*1024) ;
    //高水平的API文件上传处理
    ServletFileUpload upload = new ServletFileUpload(factory);
    try {
        //可以上传多个文件
        List<FileItem> list = (List<FileItem>)upload.parseRequest(request);
        for(FileItem item : list){
            //获取表单的属性名字
            String name = item.getFieldName();
            //如果获取的 表单信息是普通的 文本 信息
            if(item.isFormField()){                 
                //获取用户具体输入的字符串 ,因为表单提交过来的是 字符串类型的
                String value = item.getString() ;
                request.setAttribute(name, value);
            }
            //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些
            else{
                //获取路径名
                String value = item.getName() ;
                //索引到最后一个反斜杠
                int start = value.lastIndexOf("\\");
                //截取 上传文件的 字符串名字,加1是 去掉反斜杠,
                String filename = value.substring(start+1);
                request.setAttribute(name, filename);
                OutputStream out = new FileOutputStream(new File(path,filename));
                InputStream in = item.getInputStream() ;
                int length = 0 ;
                byte [] buf = new byte[1024] ;
                System.out.println("获取上传文件的总共的容量:"+item.getSize());
                // in.read(buf) 每次读到的数据存放在   buf 数组中
                while( (length = in.read(buf) ) != -1){
                    //在   buf 数组中 取出数据 写到 (输出流)磁盘上
                    out.write(buf, 0, length);
                }
                in.close();
                out.close();
            }
        }
    } catch (FileUploadException e) {
        e.printStackTrace();
    }catch (Exception e) {
    }

在获取//获取路径名 String value = item.getName() ; 这个就是文件名称 但是在IE下面是获取不到的。 FF下面一点问题没有 。

@hyan5300
Copy link
Author

hyan5300 commented Jul 3, 2014

form name="uploader" action="upload" enctype="multipart/form-data" method="post"

@2betop
Copy link
Contributor

2betop commented Jul 3, 2014

很神奇啊,ff 下居然可以成功,应该是都不成功才对啊。

每次选完文件后,我都把 input 给重置了(克隆出来一个新的,input.value 也置空了),后端居然还能收得到。

你不能用 form 包在外面通过这个 form 提交文件。原因是 ie6 - ie9 是通过 flash 实现的,根本就没有创建 input[type=file] 标签,且 flash 选择完文件后,数据都在 flash 里面,得通过flash 才能发送到服务端(不考虑把文件二进制发送给 js,然后让js 上传)。所以你还是通过 webuploader 来发送请求。

如果你要携带其他参数,请查看此 issue #145

@2betop
Copy link
Contributor

2betop commented Jul 3, 2014

后端接收方式是一样的。

@hyan5300
Copy link
Author

hyan5300 commented Jul 3, 2014

那就很诧异了。 我看您首页上面的案例, 就一个按钮的那种批量上传 , 是默认创建了input file 那种方式是否可以form提交呢

@2betop
Copy link
Contributor

2betop commented Jul 4, 2014

不能用外部 form,你得考虑 flash 啊,否则 ie 怎么办?内部封装了上传实现,对于后端来说接收方式是一样的,为何不用啊?

@hyan5300
Copy link
Author

hyan5300 commented Jul 7, 2014

@2betop 请问下 您的server 提交时, 例如2个图片 。 是分2次提交 还是一次提交2个图片。 我测试发现您是一个个进行提交的 是这样的模式吗

@2betop
Copy link
Contributor

2betop commented Jul 7, 2014

是的,两次提交。

@hyan5300
Copy link
Author

hyan5300 commented Jul 7, 2014

谢谢。 那我后台得重组字段了

@2betop 2betop closed this as completed Jul 9, 2014
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants