常用系统开发中总免不了显示图片,保存一些文件资料等操作。

  这些操作的背后,就是程序员最熟悉的 enctype="multipart/form-data"类型的表单。

说起file类型的input,我们往往会遇到问题:

  最为常见的就是编码格式-中文乱码。解决中文乱码最好的方式就是我们的项目全部使用 utf-8 格式的国际编码,因为它是可变字节长度的编码,对于占用2字节的中文绰绰有余了。另外就是使用 String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”); 将服务器编码(以tomcat为例)转换为gbk中文编码。

  其次就是request接收参数的问题。首先看段代码

//-----代码片段 spingMVC上传文件
MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;//request强制转换注意 MultipartFile file = mRequest.getFile("file");
if (!file.isEmpty()) {
String fileName = file.getOriginalFilename();
if (StringUtils.isNotBlank(fileName)) {// 因为最后一个添加的控件没有上传相应的内容
String uuid = UUID.randomUUID().toString();
String fileType = fileName.substring(fileName
.lastIndexOf("."));
// 使用字符替换图片名称,防止乱码
String tempName = uuid.substring(1, 10) + fileType; uploadFilePath = fileRootHelper.getOrigImage()
+ tempName;
File uploadfile = new File(basepath
+ uploadFilePath);// 上传地址 File mir = new File(basepath
+ fileRootHelper.getOrigImage());// 文件路径 if (!mir.exists()) {
mir.mkdirs();
}
file.transferTo(uploadfile);// 开始上传
}

执行 MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request; 该行代码时,如果请求中不包含file类型的input,必然会产生异常。

而request请求都是经过spring-mvc配置文件的,在没有进入请求方法之前,异常已经产生了。由此,问题来了 ??

如何避免异常产生呢?

  一种比较直观的方法是:

<form action="iconUpload.action" method="post"enctype="multipart/form-data">
<p>First name: <input type="text" name="fname" /></p>
<p>Last name: <input type="text" name="lname" /></p>
<p>Icon <input type="file" name = "ficon"/></p>
<input type="submit" value="Submit" />
</form>

  <input type="file" name = "ficon"/> 不选时由后台 file.isEmpty() 判断,而不是在前端做判断。

  还有一种做法是前端做判断传或是不传,后端再次判断有没有文件流过来,分别写2种处理方法 。具体代码就不贴了,且个人没有找到实现的方式代码 -_-!

个人感悟:

  每个人思维模式不相同,解决问题的思路也会不同。

  但终归是围绕 '解决问题' 而展开的,善于学习他人的思维模式,弥补自己的鄙夷。这样才能快速,高效的解决问题。俗话说:没有做不到,只有想不到 。

  虚心接纳他人意见,理解他人,这样不仅对自己成长有所帮助,更是个人修养与价值的体现。多思维是每个人人生道路上不可或缺的财富!!

Java中request请求之 - 带文件上传的form表单的更多相关文章

  1. 【文件上传】文件上传的form表单提交方式和ajax异步上传方式对比

    一.html 表单代码 …… <input type="file" class="file_one" name="offenderExcelFi ...

  2. Layer文件上传同时传递表单数据

    (1)index.html <!DOCTYPE html> <html> <head> <title>TODO supply a title</t ...

  3. servlet文件上传2——复合表单提交(数据获取和文件上传)

    上传文件时表单enctype属性必须要更改为<enctype='multipart/form-data'>:采用post提交表单,元素需要有name属性: 利用第三方jar包(common ...

  4. Struts2文件上传(基于表单的文件上传)

    •Commons-FileUpload组件 –Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目   •Commons-Fil ...

  5. jfinal文件上传和form表单值为null的解决方法

    今天使用jfinal做上传提交的时候,遇到一个问题:添加了上传功能,原来的form表单submit提交时所有值都为null了,研究了很长时间,终于发现 在jfinal上传时候,jsp加 enctype ...

  6. 文件上传之form表单篇

    form表单上传文件 作为本系列的最后一篇,也是楼主知道的第三种文件上传的方式--隆重推出Form表单 这是最传统的上传文件,提交数据的方式 Html: <form action="/ ...

  7. 理解流方式上传和form表单上传

    流方式上传: $post_input = 'php://input'; $save_path = dirname( __FILE__ ); $postdata = file_get_contents( ...

  8. Java中简单测试FastDFS的文件上传

    pom.xml文件内容如下: <dependencies> <!-- fastdfs --> <dependency> <groupId>org.cso ...

  9. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. Java NIO 网络编程基础

    Java NIO提供了一套网络api,可以用来处理连接数很多的情况.他的基本思想就是用一个线程来处理多个channel. 123456789101112131415161718192021222324 ...

  2. 使用本地phpmyadmin管理远程数据库

    使用放下挺简单的,因为某些业务需求,phpmyadmin不让放在网站服务器上,所以放在本地可以方便管理远程数据库 点击下载会下载一个  config.inc.php 吧这个文件放在phpmyadmin ...

  3. Codeforces Round #378 (Div. 2) C D

    在实验室通宵 一边做水题一边准备随时躲起来以免被门卫大爷巡查发现..结果居然没来.. 本来以为可以加几分变个颜色..结果挂了CD...状态有点差...思维不太活跃 沉迷暴力不能自拔 D 给出n个长方体 ...

  4. python - socket - server

    网络上关于socket的介绍文章数不胜数.自己记录下学习的点点滴滴.以供将来复习学习使用. socket中文的翻译是套接字,总感觉词不达意.简单的理解就是ip+port形成的一个管理单元.也是程序中应 ...

  5. Docker Compose—简化复杂容器应用的利器

    Compose是用于定义和运行复杂Docker应用的工具.你可以在一个文件中定义一个多容器的应用,然后使用一条命令来启动你的应用,然后所有相关的操作都会被自动完成. 1. 安装Docker和Compo ...

  6. C#记录程序耗时的方法

    用于准确测量运行时间的方法类: System.Diagnostics.Stopwatch 具体使用方法: using System.Diagnostics; Stopwatch stopwatch = ...

  7. git-配置公司账号

    1.初始化配置 git config --global user.name " abc" git config --global user.email "abc@123. ...

  8. 一步一步来做WebQQ机器人-(二)(第一次登陆)

    // 预计会有这些步骤,当然某些步骤可能会合并: 验证码 第一次登陆 第二次登陆 保持在线和接收消息 获取好友和群列表 发送消息 变成智能的(*゚∀゚*) webqq的登陆,分为2步,本文主要讲第一次 ...

  9. 【转载】区间信息的维护与查询(一)——二叉索引树(Fenwick树、树状数组)

    在网上找到一篇非常不错的树状数组的博客,拿来转载,原文地址. 树状数组 最新看了一下区间的查询与修改的知识,最主要看到的是树状数组(BIT),以前感觉好高大上的东西,其实也不过就这么简单而已. 我们有 ...

  10. 程序最多能new多少内存(2G内存里要放程序的5大区,HeapAlloc比new要快多了,而且超过2G的时候会告诉你)

    根据<Windows核心编程>得知:X86操作系统提供每个程序最多只有4G的虚拟内存,其中2G虚拟内存提供给系统用(具体用来干什么还待考察),还有2G的内存留给用户使用.那这2G内存能拿来 ...