SpringBoot实现文件上传和访问

用springboot实现文件的上传和访问。文件的上传首先会用到相关的工具类,Jar包,

Maven项目需要jar包:

<!-- https://mvnrepository.com/artifact/commons-io/commons-io    IO 文件流需要的包-->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.2</version> 
</dependency>
        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload   文件上传需要的包-->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>

如果放入项目中pom.xml 文件有错误,可以根据自己需要的版本去添加 :

maven官网地址:https://mvnrepository.com

在spring boot项目打成jar包后,上传文件的路径会有问题,或者可以成功上传但是服务器上找不到上传成功的文件。这时候我们需要为上传文件设置绝对路径。

上传工具类:

public class FileUploadController {

    
    /**
     * 图片上传
     * @param myfiles
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/upload")
    public static  Object uploadApk(MultipartFile myfiles, HttpServletRequest request,
            HttpServletResponse response) {

        Map<String, Object> resMap = new HashMap<String, Object>();
        if(myfiles.getSize()>1024*1024*5){
        resMap.put("code", 500);
        resMap.put("msg", "文件过大,请上传5M以内的图片");
        System.out.println("文件上传失败");
        return resMap;
        }
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path;
        Date dt = new Date();
        Long time = dt.getTime();
        if (myfiles != null) {
            String realPath ="d://uploadFiles/";  // 获取保存的路径,本地磁盘中的一个文件夹
        if (myfiles.isEmpty()) {
                // 未选择文件
                resMap.put("code", 400);
                resMap.put("msg", "未选择文件");
            } else {
                // 文件原名称
                String originFileName = "";
                // 上传文件重命名
                String originalFilename = time.toString().substring(time.toString().length() - 8,
                        time.toString().length());
                originalFilename = originalFilename.concat(".");
                originalFilename = originalFilename.concat(myfiles.getOriginalFilename().toString()
                        .substring(myfiles.getOriginalFilename().toString().indexOf(".") + 1));
                try {
                    // 这里使用Apache的FileUtils方法来进行保存
                    FileUtils.copyInputStreamToFile(myfiles.getInputStream(), new File(realPath, originalFilename));
                    resMap.put("code", 200);
                    resMap.put("msg", "上传成功");
                    resMap.put("filename", originalFilename);
                    resMap.put("path", basePath + "/static/image/"+originalFilename );

                } catch (IOException e) {
                    resMap.put("code", 500);
                    System.out.println("文件上传失败");
                    resMap.put("msg", "文件上传失败");
                    e.printStackTrace();
                }
            }

        }
        
        String  param= JSON.toJSONString(resMap);
        System.out.println(param);
        return resMap;
    }
    }

此工具类将上传的文件会有一次重命名,特别要注意的是。文件上传的保存的路径,我们需要将上传的文件保存在本地的磁盘中,然后通过配置文件中配置的路径去访问。如果不将文件存在本地,项目打成Jar包后,  文件可以上传, 但访问不成功, 导致 访问的图片都加载不到.

上传接口

@RequestMapping("/updateheader")
    public ResultModel updatehead(MultipartFile myfiles, String token, HttpServletRequest request,
            HttpServletResponse response, Member mm) {
        Map<String, Object> map = (Map<String, Object>) FileUploadController.uploadApk(myfiles, request, response);//调用工具类,将文件上传。特别要注意的是  参数中的第一个参数。MultipartFile myfiles,    myfiles 的名称要和页面中 <input type="file" name="myfiles" /> 中的name名称保持一致,否则获取不到你上传的文件,文件上传成功后会返回一个MAP集合。
        mm.setM_logo(map.get("path").toString()); 
        int bool = userService.updatemember(mm);
        if (bool > 0) {
            ResultModel model = new ResultModel();
            model.setCode(200);
            model.setDetail(map.get("path").toString());
            model.setMsg("更换成功");
            return model;
        } else {
            return error(500, "系统异常");
        }
    }

关于页面的提交,可以用form表单提交,也可以使用相关的前端上传文件的插件上传,例如:ajaxfileload  ,bootstrap 中的fileinput

都可以进行上传文件。根据需要自由选择,我使用的是表单提交。

这是还没有上传头像

控制台会打印返回的信息:

{"msg":"上传成功","path":"http://192.168.1.179:8080/static/image/91492957.jpg","code":200,"filename":"91492957.jpg"}

http://192.168.1.179:8080/static/image/91492957.jpg  这就是文件上传返回的绝对路径,如果你没有配置通过虚拟路径访问的配置,即使你上传成功了,通过这个路径也访问不到。

如果你上传图片之后,显示还是这样子,上传的图片的路径也正确,就是访问不到,关键时刻到了,缺少相关配置,

下面是配置信息:

首先是需要一个类

一:UploadFilePathConfig配置类

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 设置虚拟路径,访问绝对路径下资源
 * @author Administrator
 *
 */
@Configuration
public class UploadFilePathConfig implements WebMvcConfigurer{
    @Value("${file.staticAccessPath}")
    private String staticAccessPath;
    @Value("${file.uploadFolder}")
    private String uploadFolder;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(staticAccessPath).addResourceLocations("file:" + uploadFolder);
    }

}

这是设置虚拟的路径,通过虚拟的路径访问绝对路径下的文件。

二:在application.properties  中进行配置

#jsp静态资源配置
spring.mvc.view.prefix=/admin/
spring.mvc.view.suffix=.jsp
#配置静态资源访问路径
spring.mvc.static-path-pattern=/webapp/**


#静态资源对外暴露的访问路径
file.staticAccessPath=/static/image/**
#文件上传目录(注意Linux和Windows上的目录结构不同)
#file.uploadFolder=/root/uploadFiles/
file.uploadFolder=d://uploadFiles/   #特别要注意此位置

配置完成之后,项目重新启动。重新进行上传。

上传之后的,会立即显示出来。

同时请注意查看你的磁盘中文件是否保存进去,

此时就成功上传保存了文件。 有问题可以评论,帮助解决,如果有更好的方案,可以进行探讨。谢谢

猜你喜欢

转载自blog.csdn.net/qq_34350964/article/details/84028262