卜若的代码笔记系列-Web系列-MVC框架-如何在mvc中使用@RequestMapping来上传图片-3002

5 篇文章 0 订阅

1.首先这个问题提出的背景是针对于表单提交的

比如这种

    <h1>上传图片 </h1>
    <form action="save" method="post" enctype="multipart/form-data">
  <input type="file" required="required" name="pic" id="exampleInputFile">
    <button type="submit" >提交</button>
    </form>


我们创建了一个表单,当我们点击提交时,它会将输入的参数
<input></input>
标签里面的数据上传到web服务器。
而我们就应该怎么才能获得到这种参数(通过@RequestMapping)
的方式。基于此,我们现在开始来解决这个问题

2.看到一篇文章比较好,嗯,先相当于引用一下,当然,这部分大部分还引用一下,当然,这部分大部分还是
原创,主要是我是在写一个代码故事,一份攻略,这个链接相当于
一个答案哈。
https://my.oschina.net/u/1246822/blog/527715
ps:我在csdn上贴开源社区的博客。。会不会被404呀??

3.我们来屡一下你提交的过程
首先,你需要一个方法去浏览你的文件,就是文件dialog一样的东西
这个用这个标签
<input type="file" required="required" name="pic" id="exampleInputFile">

这个就能够打开文件浏览窗口啦。
文件浏览窗口是打开了,然后你选择了一个图片文件
接着,你是不是需要拷贝一下文件到你的前端的内存里。。呢?
答案显然是的

当我们提交后,会直接通过你看不见的函数直接从你的电脑上传到了
服务器,嗯,这点还是相当简单的。

然后来看看我写的提交的代码

<form action="file/upload" method="post" enctype="multipart/form-data">         
      <input type="file" name="file"/><br/>        
      <button type="submit" >提交</button>
</form>

这一串代码基本上是被我简化到了极致
嗯,首先我们的action和enctype必须对应起来
我们来看一下action的相关属性(假如你要吃前端的饭,你首先得明白
这些比较重要的关键字的相关属性是一个什么情况,嗯,我这里是在w3c里面找的
资源)
http://www.w3school.com.cn/tags/tag_form.asp
#action
这里对action标签的表述是
规定当前提交表单时,向何处发送表单数据
嘛,这个表述和我的预期还是有点差别,没事,再找找
。。。。
//emmm...他说的没错
比如我这里创建一个表单

<form action = "xxx">

<input type = "submit"/>

</form>


这样子,我们点击提交之后,就会根据action的内容将请求发送给
你的servlet,并且在ervlet里面完成任务的分配。

注意,假如你看过我的《如何使用@RequestMapping注解》这篇文章
就应该知道一点,我们的mvc框架里面是如何进行请求映射。
action里面定义了你映射请求。
但是我这里要说的是,假如你要映射一个带有文件上传的请求
格式就必须是这样的
<action = "file/xxx" enctype="multipart/form-data">
相对应,enctype用于描述你的file的编码格式这里使用的是
multipart这种东西
接着你需要指定是post(匿名)还是get(非匿名)
最后完整的form标签就长这样子

<form action="file/upload" method="post" enctype="multipart/form-data">         
     
</form>

我这里映射了一个upload请求给我的控制器,之间的流程不清楚的同学可以去看我的
《如何使用@RequestMapping注解》
这篇文章。

好了,接下来,通过这个表单的提交,它成功的将流传递到了服务器。
接下来我就要如何的从request里面获取数据。


我们来看一下我解决

@RequestMapping(value="/upload",method=RequestMethod.POST)
这个映射请求的方法。
哦,对了,到这里嘛顺便提一下,可能有些同学和我一样的萌新,菜鸡
有些代码变化一点确实没有比较系统的学习是不能理解的,我这里就多说一句

@RequestMapping(value="/upload",method=RequestMethod.POST)
和上一章
《如何使用@RequestMapping注解》
里面的@RequestMapping("")其实是差不多的,只是,我在这里指定了method
@RequestMapping这个注解的一个参数罢了,删了也没关系,干脆我删了算了    

@RequestMapping("/upload")
    private String fildUpload(@RequestParam(value="file",required=false) MultipartFile file,
        HttpServletRequest request)throws Exception{

        String path="";
        if(!file.isEmpty()){
            String uuid = UUID.randomUUID().toString().replaceAll("-","");
            String contentType=file.getContentType();
            String imageName=contentType.substring(contentType.indexOf("/")+1);
            path=uuid+"."+imageName;
            file.transferTo(new File("D:\\temp\\"+path));
        }
        request.setAttribute("imagesPath", path);
        return "success";
    }


    
    @RequestParam(value="file",required=false) MultipartFile file
    我们来看一下它直接指定的这个参数,我告诉你们哦,这个参数并不是
    事先在xx-servlet或者web.xml里面配置,它这个参数其实是和你的
    
<form action="file/upload" method="post" enctype="multipart/form-data">         
     
</form>
    这个表单时有关系的!
    value = file 就是在action="file/upload"(反正我是这样猜的,正确率不保证,因为我也是萌新)
    ###################
    而我们的文件信息就放在file里面了。这个应该是mvc里面自带的。
    file.transferTo(new File("D:\\temp\\"+path));
    这一句参数就是将整个文件写入到磁盘里。
    顺便说一句就是我的D:\\temp\\是在d盘创建的文件夹,如果没创建可能会炸~
    
    String contentType=file.getContentType();
    String imageName=contentType.substring(contentType.indexOf("/")+1);
    这两句话其实就是切出你的文件后缀名        
    
    String uuid = UUID.randomUUID().toString().replaceAll("-","");
    生成文件乱码,比如这种的
    1f5a23fa0ef24b8780c155857f218126
    
    
ok,最后,希望这篇文章能对你有帮助,请每一位引用的作者能够标出文章出处。
虽然在下文采不是太好,但好歹也是一个字一个字码的哈。
最后,欢迎留言,欢迎关注!
(其实我也是很牛逼的来着~)
    
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值