当前位置: 代码迷 >> 综合 >> SpringMVC -> 上传文件到服务器(commonsmultipartfile)
  详细解决方案

SpringMVC -> 上传文件到服务器(commonsmultipartfile)

热度:41   发布时间:2023-12-16 09:42:04.0

文章目录

    • 导包
    • mvc.xml
    • controller:方法一
    • controller:方法二

导包

1.servlet的高版本的包,如果你还加了低版本的,就把低版本的删除了,不然等会找不到某些方法的

        <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency>

mvc.xml

1.这是固定的,不变的
2.类是commonsmultipartresolver
3.id必须是multipartResolver,一点都不能改,否则保证出错

    <!--文件上传配置--><bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"id="multipartResolver"><!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 --><property name="defaultEncoding" value="utf-8"/><!-- 上传文件大小上限,单位为字节(10485760=10M) --><property name="maxUploadSize" value="10485760"/><property name="maxInMemorySize" value="40960"/></bean>

controller:方法一

1.getoriginalfilename():获取上传文件的名字
2.如果你没有上传东西,就重定向到原来的位置极速index.html
3.requset.getservletcontext.getrealpath:在服务器设置一个保存的位置
4.如果设置的位置目录不存在,就怎么造一个
5.开始传,输入输出io流创建,一顿输出
6.关闭流,重定向到主页,让你继续传

@Controller
public class FileController {
    //@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象//批量上传CommonsMultipartFile则为数组即可@RequestMapping("/upload")public String fileUplaod(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request) {
    //获取文件名 : file.getOriginalFilename();String originalFilename = file.getOriginalFilename();//如果文件名为空,直接回到首页!if ("".equals(originalFilename)) {
    return "redirect:/index.html";}//上传路径保存设置String realPath = request.getServletContext().getRealPath("/upload");File path = new File(realPath);//如果路径不存在,创建一个if (!path.exists()) {
    path.mkdirs();}//try-with-resources环绕,这样就不用手动关闭流了try {
    try (InputStream inputStream = file.getInputStream()) {
    try (FileOutputStream outputStream = new FileOutputStream(new File(path, originalFilename))) {
    //读取写出int len = 0;byte[] bytes = new byte[1024];while ((len = inputStream.read(bytes)) != -1) {
    outputStream.write(bytes, 0, len);outputStream.flush();}}}} catch (IOException e) {
    e.printStackTrace();}return "redirect:/index.html";}
}

controller:方法二

1.一定要先判断是不是传了文件,不判断,下面就不会创建upload文件夹,就会报错
2.没有目录就创建一个目录upload,在满足1的条件下
3.file.transferTo:创建一个文件,file1是目录,getoriginalfilename是文件名字;目录/名字

@Controller
public class FileController2 {
    @RequestMapping("/upload2")public String fileUpload(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request) {
    //获取文件名 : file.getOriginalFilename();String originalFilename = file.getOriginalFilename();//如果文件名为空,直接回到首页!不返回下面可能会创建一个文件,等会transferTo的时候识别不了位置if ("".equals(originalFilename)) {
    return "redirect:/index.html";}//上传路径保存设置String realPath = request.getServletContext().getRealPath("/upload");File file1 = new File(realPath);//没有就创建一个,创建的如果没有前面的if判断,就会创建一个空的目录,相当于没创建//那么如果第一次提交没有东西,创建一个等于没创建的文件夹,下次再提交一个真的文件的时候//就不会再执行if,因为已经识别存在了文件夹,下面就会出现找不到upload文件夹的错误if (!file1.exists()) {
    file1.mkdir();}try {
    //通过CommonsMultipartFile的方法直接写文件,file1的名字就是upload目录+/+上传文件名,合起来就是文件了//如果file1是"",就会创建一个名字是upload的文件和一个空的文件夹(等于没有)file.transferTo(new File(file1 + "/" + file.getOriginalFilename()));} catch (IOException e) {
    e.printStackTrace();}return "redirect:/index.html";}
}
  相关解决方案