SpringBoot图片上传(ajax单图片上传+预览)

代码

pom.xml

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.1.3</version>
        </dependency>

        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.1.26</version>
        </dependency>
    </dependencies>

前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ajax图片上传</title>
</head>
<body>
<form action="imageUpload" method="post" enctype="multipart/form-data">
    <input type="file" name="fileName" id="filename" accept="image/png, image/jpeg, image/jpg" onchange="checkImage()">
    <input type="button" id="submitBtn" onclick="checkSubmit()" value="上传"/>
</form>
<div id="showImage"></div>
<div id="onLoadImage"></div>
</body>
<script src="/webjars/jquery/3.3.1/jquery.min.js"></script>
<script src="/webjars/bootstrap/4.1.3/js/bootstrap.min.js"></script>
<script type="text/javascript">

    //检查图片
    function checkImage() {
        var fileName=$("#filename").val();
        fileName=fileName.replace("C:\\fakepath\\","");
        var flag=true;
        if(fileName==""){
            flag=false;
            alert("请选择图片");
        }
        else{
            var size = $("#filename")[0].files[0].size;
            if(size/1000>100){
                flag=false;
                alert("图片大小不能超过100KB");
            }
        }
        if(flag){
            onLoadImage();
        }
        else{//清除input type=file的显示内容
            $("#filename").val("");
        }
        return flag;
    }

    //预览图片
    function onLoadImage() {
        var file=$('#filename').get(0).files[0];
        var reader = new FileReader();
        //将文件以Data URL形式读入页面
        reader.readAsDataURL(file);
        reader.onload=function(e){
            //显示文件
            $("#onLoadImage").html('<img src="' + this.result +'" alt="" />');
        }
    }

    /*上传图片
   详细参考链接:https://www.cnblogs.com/qiumingcheng/p/6854933.html
   1.processData设置为false。因为data值是FormData对象,不需要对数据做处理。
   2.<form>标签添加enctype="multipart/form-data"属性。
   3.cache设置为false,上传文件不需要缓存。
   4.contentType设置为false,不设置contentType值,因为是由<form>表单构造的FormData对象,且已经声明了属性enctype="multipart/form-data",所以这里设置为false。
   */
    function checkSubmit() {
        var formdata=new FormData();
        formdata.append('fileName',$('#filename').get(0).files[0]);
        $.ajax({
            async: false,
            type: 'POST',
            url: "/imageUpload",
            dataType: 'json',
            data: formdata,
            contentType:false,//ajax上传图片需要添加
            processData:false,//ajax上传图片需要添加
            success: function (data) {
                if(data.hasOwnProperty("relativePath")){
                    $("#showImage").html("<img src='"+data.relativePath+"'/>");
                }
                else {
                    $("#showImage").html("上传失败");
                }
                alert(data.result_msg);
            },
            error: function (e) {
                alert("error");
            }
        })
    }
</script>
</html>

后台

@RequestMapping("/imageUpload")
    public Map imageUpload(@RequestParam("fileName") MultipartFile file){
        String result_msg="";//上传结果信息

        Map<String,Object> root=new HashMap<String, Object>();

        if (file.getSize() / 1000 > 100){
            result_msg="图片大小不能超过100KB";
        }
        else{
            //判断上传文件格式
            String fileType = file.getContentType();
            if (fileType.equals("image/jpeg") || fileType.equals("image/png") || fileType.equals("image/jpeg")) {
                // 要上传的目标文件存放的绝对路径
                //用src为保存绝对路径不能改名只能用原名,不用原名会导致ajax上传图片后在前端显示时出现404错误-->原因未知
//                String localPath="F:\\IDEAProject\\imageupload\\src\\main\\resources\\static\\img";
                final String localPath="F:\\IDEAProject\\imageupload\\target\\classes\\static\\img";
                //上传后保存的文件名(需要防止图片重名导致的文件覆盖)
                //获取文件名
                String fileName = file.getOriginalFilename();
                //获取文件后缀名
                String suffixName = fileName.substring(fileName.lastIndexOf("."));
                //重新生成文件名
                fileName = UUID.randomUUID()+suffixName;
                if (FileUtils.upload(file, localPath, fileName)) {
                    //文件存放的相对路径(一般存放在数据库用于img标签的src)
                    String relativePath="img/"+fileName;
                    root.put("relativePath",relativePath);//前端根据是否存在该字段来判断上传是否成功
                    result_msg="图片上传成功";
                }
                else{
                    result_msg="图片上传失败";
                }
            }
            else{
                result_msg="图片格式不正确";
            }
        }

        root.put("result_msg",result_msg);

//        JSON.toJSONString(root,SerializerFeature.DisableCircularReferenceDetect);
        String root_json=JSON.toJSONString(root);
        System.out.println(root_json);
        return root;
    }

图片上传工具类

public class FileUtils {

    /**
     * @param file     文件
     * @param path     文件存放路径
     * @param fileName 保存的文件名
     * @return
     */
    public static boolean upload(MultipartFile file, String path, String fileName) {

        //确定上传的文件名
        String realPath = path + "\\" + fileName;
        System.out.println("上传文件:" + realPath);

        File dest = new File(realPath);

        //判断文件父目录是否存在
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdir();
        }

        try {
            //保存文件
            file.transferTo(dest);
            return true;
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }

    }

}


效果

起始界面
起始界面
选择上传图片+预览
选择上传图片+预览
Ajax上传+前端显示
Ajax上传+前端显示
单图片上传+预览
多图片上传

  • 13
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Vue.js 和 SpringBoot 结合可以构建一个强大的后端服务和前端用户界面,用于实现图片上传功能。这里是一个简要的步骤概述: 1. **前端(Vue)**: - 使用 Vue CLI 创建一个新的项目,并安装必要的依赖,如 `axios` (用于发送 HTTP 请求) 和 `vue-file-upload` 或者 `iview` 这样的 UI 组件库中的文件上传组件。 - 在 HTML 元素上创建一个表,包含一个文件输入元素 `<input type="file">`,这将让用户选择要上传的图片。 - 使用 JavaScript 视图层代码监听文件输入事件,当用户选择文件后,发送 AJAX 请求到 SpringBoot 后台。 ```javascript <template> <div> <button @click="uploadFile">上传图片</button> <img :src="imageUrl" v-if="imageUrl"> </div> </template> <script> export default { data() { return { imageUrl: '', }; }, methods: { uploadFile() { const file = this.$refs.fileInput.files; // 发送请求到SpringBoot接口 axios.post('/api/upload', { file }, { headers: {'Content-Type': 'multipart/form-data'} }) .then(response => { this.imageUrl = response.data.url; // 存储上传后的图片 URL }); }, }, }; </script> ``` 2. **后端(SpringBoot)**: - 在 SpringBoot 应用中,创建一个 RESTful API 接口,例如 `/api/upload`,用于处理图片上传。使用 Spring MVC 或 Spring WebFlux 来处理HTTP请求。 - 实现图片存储逻辑,通常会使用文件系统、云存储服务或第三方库如 Amazon S3、Google Cloud Storage。 ```java @PostMapping("/upload") public ResponseEntity<String> handleImageUpload(@RequestParam("file") MultipartFile file) throws IOException { try { // 将文件保存到服务器或云存储 String filePath = saveUploadedFile(file); return ResponseEntity.ok("http://your-server/" + filePath); // 返回存储后的图片URL } catch (Exception e) { log.error("Error uploading file", e); throw new RestResponseEntity(HttpStatus.BAD_REQUEST, "图片上传失败"); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值