老师,我的图片上传出现问题

老师,我的图片上传出现问题

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>图书管理功能</title>
    <style>
        #dlgBook{
            padding: 10px
        }
    </style>
    <link rel="stylesheet" href="/resources/layui/css/layui.css">

    <script src="/resources/wangEditor.min.js"></script>


    <script type="text/html" id="toolbar">
        <div class="layui-btn-container">
            <button class="layui-btn layui-btn-sm" id="btnAdd" onclick="showCreate()">添加</button>
        </div>
    </script>

</head>
<body>


<div class="layui-container">
    <blockquote class="layui-elem-quote">图书列表</blockquote>
   <!-- 数据表格 -->
    <table id="grdBook" lay-filter="grdBook"></table>
</div>
<!--表单内容-->
<div id="dialog" style="padding: 10px;display: none">
    <form class="layui-form" >
        <div class="layui-form-item">
         <!-- 图书类别 -->
            <select id="categoryId" name="categoryId" lay-verify="required" lay-filter=
         "categoryId">
                <option value=""></option>
                <option value="1">前端</option>
            <option value="2">后端</option>
            <option value="3">测试</option>
            <option value="4">产品</option>
            </select>

        </div>
        <div class="layui-form-item">
         <!-- 书名 -->
            <input type="text" id="bookName" name="bookName" required lay-verify="required" placeholder="请输入书名"
                   autocomplete="off" class="layui-input">
        </div>


        <div class="layui-form-item">
         <!-- 子标题 -->
            <input type="text" id="subTitle" name="subTitle" required lay-verify="required" placeholder="请输入子标题"
                   autocomplete="off" class="layui-input">
        </div>

        <div class="layui-form-item">
         <!-- 作者 -->
            <input type="text" id="author" name="author" required lay-verify="required" placeholder="请输入作者信息"
                   autocomplete="off" class="layui-input">
        </div>

        <div style="margin-top: 30px;font-size: 130%">图书介绍(默认第一图将作为图书封面)</div>
        <div class="layui-form-item" >
         <!-- wangEditor编辑器 -->
            <div id="editor" style="width: 100%">

            </div>
        </div>
      <!-- 图书编号 -->
        <input id="bookId" type="hidden">
      <!-- 当前表单操作类型,create代表新增 update代表修改 -->
        <input id="optype"  type="hidden">
        <div class="layui-form-item" style="text-align: center">
         <!-- 提交按钮 -->
            <button class="layui-btn" lay-submit="" lay-filter="btnSubmit">立即提交</button>
        </div>
    </form>
</div>
<script src="/resources/layui/layui.all.js"></script>
<script>

    var table = layui.table; //table数据表格对象
    var $ = layui.$; //jQuery
    var editor = null; //wangEditor富文本编辑器对象
    //初始化图书列表
    table.render({
        elem: '#grdBook'  //指定div
        , id : "bookList" //数据表格id
        , toolbar: "#toolbar" //指定工具栏,包含新增添加
        , url: "/management/book/list" //数据接口
        , page: true //开启分页
        , cols: [[ //表头
            {field: 'bookName', title: '书名', width: '300'}
            , {field: 'subTitle', title: '子标题', width: '200'}
            , {field: 'author', title: '作者', width: '200'}
            , {type: 'space', title: '操作', width: '200' , templet : function(d){
               //为每一行表格数据生成"修改"与"删除"按钮,并附加data-id属性代表图书编号
                    return "<button class='layui-btn layui-btn-sm btn-update'  data-id='" + d.bookId + "' data-type='update' onclick='showUpdate(this)'>修改</button>" +
                        "<button class='layui-btn layui-btn-sm btn-delete'  data-id='" + d.bookId + "'   onclick='showDelete(this)'>删除</button>";
                }
            }
        ]]
    });
   //显示更新图书对话框
   //obj对应点击的"修改"按钮对象
    function showUpdate(obj){
      //弹出"编辑图书"对话框
        layui.layer.open({
            id: "dlgBook", //指定div
            title: "编辑图书", //标题
            type: 1, 
            content: $('#dialog').html(), //设置对话框内容,复制自dialog DIV
            area: ['820px', '730px'], //设置对话框宽度高度
            resize: false //是否允许调整尺寸
        })

        var bookId = $(obj).data("id"); //获取"修改"按钮附带的图书编号
        $("#dlgBook #bookId").val(bookId); //为表单隐藏域赋值,提交表单时用到

        editor = new wangEditor('#dlgBook #editor'); //初始化富文本编辑器
        editor.customConfig.uploadImgServer = '/management/book/upload' //设置图片上传路径
        editor.customConfig.uploadFileName = 'img'; //图片上传时的参数名
        editor.create(); //创建wangEditor
        $("#dlgBook #optype").val("update"); //设置当前表单提交时提交至"update"更新地址

      //发送ajax请求,获取对应图书信息
        $.get("/management/book/id/" + bookId , {} , function(json){
         //文本框回填已有数据
            $("#dlgBook #bookName").val(json.data.bookName);//书名
            $("#dlgBook #subTitle").val(json.data.subTitle); //子标题
            $("#dlgBook #author").val(json.data.author);//作者
            $("#dlgBook #categoryId").val(json.data.categoryId); //分类选项
            editor.txt.html(json.data.description); //设置图文内容
            layui.form.render();//重新渲染LayUI表单
        } , "json")



    }
   //显示新增图书对话框
    function showCreate(){
      //弹出"新增图书"对话框
        layui.layer.open({
            id: "dlgBook",
            title: "新增图书",
            type: 1,
            content: $('#dialog').html(),
            area: ['820px', '730px'],
            resize: false
        })
      //初始化wangEditor
        editor = new wangEditor('#dlgBook #editor');
        editor.customConfig.uploadImgServer = '/management/book/upload';//设置图片上传地址
        editor.customConfig.uploadFileName = 'img';//设置图片上传参数
        editor.create();//创建wangEditor

        layui.form.render(); //LayUI表单重新
        $("#dlgBook #optype").val("create");//设置当前表单提交时提交至"create"新增地址

    };

   //对话框表单提交
    layui.form.on('submit(btnSubmit)', function(data){
      //获取表单数据
        var formData = data.field;
      
      //判断是否包含至少一副图片,默认第一图作为封面显示
        var description = editor.txt.html();
        if(description.indexOf("img") == -1){
            layui.layer.msg('请放置一副图片作为封面');
            return false;
        }
      //获取当前表单要提交的地址
      //如果是新增数据则提交至create
      //如果是更新数据则提交至update
        var optype = $("#dlgBook #optype").val();
      
        if(optype == "update"){
         //更新数据时,提交时需要附加图书编号
            formData.bookId=$("#dlgBook #bookId").val();
        }
      //附加图书详细描述的图文html
        formData.description = description;
      //向服务器发送请求
        $.post("/management/book/" + optype , formData , function(json){
            if(json.code=="0"){
            //处理成功,关闭对话框,刷新列表,提示操作成功
                layui.layer.closeAll();
                table.reload('bookList');
                layui.layer.msg('数据操作成功,图书列表已刷新');
            }else{
            //处理失败,提示错误信息
                layui.layer.msg(json.msg);
            }
        } ,"json")
        return false;
    });
   //删除图书
    function showDelete(obj){
      //获取当前点击的删除按钮中包含的图书编号
        var bookId = $(obj).data("id");
      //利用layui的询问对话框进行确认
        layui.layer.confirm('确定要执行删除操作吗?', {icon: 3, title:'提示'}, function(index){
               
            //确认按钮后发送ajax请求,包含图书编号
            $.get("/management/book/delete/" + bookId, {}, function (json) {
               if(json.code=="0"){
                  //删除成功刷新表格
                  table.reload('bookList');
                  //提示操作成功
                  layui.layer.msg('数据操作成功,图书列表已刷新');
                  //关闭对话框
                  layui.layer.close(index);
               }else{
                  //处理失败,提示错误信息
                  layui.layer.msg(json.msg);
               }
            }, "json");
         
        });

    }

</script>
</body>
</html>
package com.imooc.reader.controller.management;

import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/management/book")
public class MBookController {
    @GetMapping("/index.html")
    public ModelAndView showBook(){
        return new ModelAndView("/management/book");
    }

    /**
     * wangEditor文件上传
     * @param file 上传文件
     * @param request 原生请求对象
     * @return
     * @throws IOException
     */
    @PostMapping("/upload")
    @ResponseBody
    public Map upload(@RequestParam("img") MultipartFile file , HttpServletRequest request) throws IOException {
        //得到上传目录
        String uploadPath = request.getServletContext().getResource("/").getPath() + "/upload/";
        //文件名
        String fileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
        //扩展名
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        //保存文件到upload目录
        file.transferTo(new File(uploadPath + fileName + suffix));
        Map result = new HashMap();
        result.put("errno", 0);
        result.put("data", new String[]{"/upload/" + fileName + suffix});
        return result;
    }
}

http://img1.sycdn.imooc.com//climg/5f3f2d7d090d272518440974.jpg10:07:45 DEBUG {http-nio-80-exec-3} o.s.w.s.DispatcherServlet - GET "/management/book/index.html", parameters={}
10:07:45 DEBUG {http-nio-80-exec-3} o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped to com.imooc.reader.controller.management.MBookController#showBook()
10:07:45 DEBUG {http-nio-80-exec-3} o.s.w.s.v.f.FreeMarkerView - View name '/management/book', model {}
10:07:45 DEBUG {http-nio-80-exec-3} o.s.w.s.v.f.FreeMarkerView - Rendering [/management/book.ftl]
10:07:45 DEBUG {http-nio-80-exec-3} o.s.w.s.DispatcherServlet - Completed 200 OK
10:07:45 DEBUG {http-nio-80-exec-4} o.s.w.s.DispatcherServlet - GET "/management/book/list?page=1&limit=10", parameters={masked}
10:07:45 DEBUG {http-nio-80-exec-4} o.s.w.s.h.SimpleUrlHandlerMapping - Mapped to org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler@7ffe0bf6
10:07:45 DEBUG {http-nio-80-exec-4} o.s.w.s.DispatcherServlet - Completed 404 NOT_FOUND
10:07:54 DEBUG {http-nio-80-exec-5} o.s.w.s.DispatcherServlet - POST "/management/book/upload", parameters={}
10:07:55 DEBUG {http-nio-80-exec-5} o.s.w.m.c.CommonsMultipartResolver - Part 'img', size 288692 bytes, filename='1.jpg'
10:07:55 DEBUG {http-nio-80-exec-5} o.s.w.s.m.m.a.RequestMappingHandlerMapping - Mapped to com.imooc.reader.controller.management.MBookController#upload(MultipartFile, HttpServletRequest)
10:07:55 DEBUG {http-nio-80-exec-5} o.s.w.m.c.CommonsMultipartFile - Part 'img',  filename '1.jpg': moved to [C:\licheng\intellij%20IDEA\imooc-reader\out\artifacts\imooc_reader_Web_exploded\upload\20200821100755047.jpg]
10:07:55 DEBUG {http-nio-80-exec-5} o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Using 'application/json', given [*/*] and supported [application/json, application/*+json]
10:07:55 DEBUG {http-nio-80-exec-5} o.s.w.s.m.m.a.RequestResponseBodyMethodProcessor - Writing [{errno=0, data=[Ljava.lang.String;@6deb1ad4}]
10:07:55 DEBUG {http-nio-80-exec-5} o.s.w.m.c.CommonsMultipartResolver - Cleaning up part 'img', filename '1.jpg'
10:07:55 DEBUG {http-nio-80-exec-5} o.s.w.s.DispatcherServlet - Completed 200 OK
10:07:55 DEBUG {http-nio-80-exec-6} o.s.w.s.DispatcherServlet - GET "/upload/20200821100755047.jpg", parameters={}
10:07:55 DEBUG {http-nio-80-exec-6} o.s.w.s.h.SimpleUrlHandlerMapping - Mapped to org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler@7ffe0bf6
10:07:55 DEBUG {http-nio-80-exec-6} o.s.w.s.DispatcherServlet - Completed 404 NOT_FOUND
10:08:01 DEBUG {http-nio-80-exec-8} o.s.w.s.DispatcherServlet - GET "/resources/wangEditor.min.js.map", parameters={}
10:08:01 DEBUG {http-nio-80-exec-8} o.s.w.s.h.SimpleUrlHandlerMapping - Mapped to org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler@7ffe0bf6
10:08:01 DEBUG {http-nio-80-exec-8} o.s.w.s.DispatcherServlet - Completed 404 NOT_FOUND

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,在如下路径中多了%20,这应该是有空格造成,如:

http://img1.sycdn.imooc.com//climg/5f3f94b509203f9c08330480.jpg

这里建议同学将项目换到没有空格以及中文的路径再试试。

或者同学可以在upload方法中,使用URLDecoder.decode(uploadPath,"UTF-8")对路径使用UTF-8编码再试试,如:

http://img1.sycdn.imooc.com//climg/5f3f95d509200e8812530411.jpg

祝:学习愉快~

好帮手慕阿满 2020-08-21 15:30:17

同学你好,如下报错提示404,如:

http://img1.sycdn.imooc.com//climg/5f3f764e0977b97608240441.jpg

一个是获取上传的图片时,报404,一个是wangEditor.min.js.map报404。

建议同学检查一下out或者target文件夹下的upload目录中,查看一下20200821100755047.jpg图片是否存在,图片名称是否正确等。

另外wangEditor.ming.js中,如下是被注释的,建议同学检查一下,如果没有注释掉,添加//将其注释掉再试试。

http://img1.sycdn.imooc.com//climg/5f3f77c00975dc9210320180.jpg

祝:学习愉快~

  • 提问者 慕仰7036876 #1
    老师,upload中没有图片,我选择图片后,直接弹窗显示图片上传失败
    2020-08-21 16:55:00
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师