zoukankan      html  css  js  c++  java
  • 表单Content-Type为multipart/form-data时,后台数据的接收

    我们在写form提交表单的时候,后台大多数用request.getParameter的方式来接收前台输入的数据。但如果我们表单中提交的数据包含file文件传输的话,我们需要将Content-Type改为multipart/form-data。这时后台就不能再通过request.getParameter来获取表单的内容了。就需要通过request的输入流request.getInputStream来获取表单内容了。这里记录一种获取表单内容的方式,这种方式既可以获得表单的文本数据也可以获取图片的字节流

    try {
                    String serverRealPath = request.getSession().getServletContext().getRealPath("/");
                    String path=serverRealPath+"saveImg";//文件保存路径
                    DiskFileItemFactory disk=new DiskFileItemFactory();
                    ServletFileUpload sfu=new ServletFileUpload(disk);
                    try {
                        List<FileItem> list=sfu.parseRequest(request);
                        for(FileItem file:list){
                            String fileName=file.getName();
                            if(fileName==null || "".equals(fileName)){
                                DataInputStream dataStream = new DataInputStream(
                                        file.getInputStream());
                                ByteArrayOutputStream output = new ByteArrayOutputStream();
                                byte[] bytes = new byte[1024];
                                int n = 0;
                                while((n=dataStream.read(bytes))!= -1){
                                    output.write(bytes, 0, n);
                                }
                                byte[] newbytes = output.toByteArray();
                                name = new String(newbytes,"UTF-8");
                                
                            }else{
                                LOGGER.info("进入文件上传方法");
                                fileName=fileName.substring(fileName.lastIndexOf("\")+1);
                                String extName=fileName.substring(fileName.lastIndexOf("."));//获取扩展.xxx
                                String newName=tarr_id+extName;//新名称
                                InputStream is = file.getInputStream();// 获取fileItem中的上传文件的输入流
                                FileOutputStream fos = new FileOutputStream(path+ File.separator + newName);// 创建一个文件输出流
                                byte buffer[] = new byte[1024];// 创建一个缓冲区
                                int length = 0;// 判断输入流中的数据是否已经读完的标识
                                while ((length = is.read(buffer)) > 0) {// 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
                                    fos.write(buffer, 0, length);// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\" +filename)当中
                                }
                                //按照id生存新的文件名称
                                filePath=newName;
                                LOGGER.info("file1_path的值为:"+newName);
                                is.close();// 关闭输入流
                                fos.close();// 关闭输出流
                                file.delete();// 删除处理文件上传时生成的临时文件
                            }
                            
                        }
                    } catch (Exception e) {
                        LOGGER.error("文件读取失败!");
                        e.printStackTrace();
                    }
                } catch (Exception e) {
                    LOGGER.error("文件上传失败!");
                    e.printStackTrace();
                }

    这里可以将request内容转为一个FileItem的list,然后可以遍历这个list来获取表单的内容,如果其中包含文件的话,file.getName是可以获取文件名的,如果getName的值为空的话,就说明这个不是文件。然后可以通过file.getInputStream获取其输入流,然后将其输出成ByteArrayOutputStream 字节输出流,就可以获取内容。

  • 相关阅读:
    Oracle中Blob转换成Clob
    【转】解决PowerDesigner 反向工程没有注释(备注)(SQL Server2008)+ Sql导入powerdesigner时中文丢失问题(Oracle11g)
    中国大陆开源镜像站汇(好东西大家一起用)
    【转】 CSS样式丢失总结
    .net程序错误:BadImageFormatException....如果在安装32位Oracle客户端组件的情况下以64位模式运行
    [转]程序员常用不常见很难得的地址大全,转来自己用
    【转】(C#)用MyXls生成Excel报表
    C# 生成Excel 并保存 包含web和winform调用方法
    ThinkPHP运算符与PHP运算符对照表
    ThinkPHP常用配置路径
  • 原文地址:https://www.cnblogs.com/qinglangyijiu/p/10696178.html
Copyright © 2011-2022 走看看