老师,图片没有被保存到upload文件中

老师,图片没有被保存到upload文件中

package com.imooc.web.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.imooc.mainclass.Book;
import com.imooc.utils.UploadUtils;

@WebServlet("/addBookServlet")
public class addBookServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
 
    public addBookServlet() {
        super();
       
    }

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		Map<String,String> map=new HashMap<String,String>();
		//创建磁盘文件项工厂
		DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();
		//创建核心解析类
		ServletFileUpload fileUpload=new ServletFileUpload(diskFileItemFactory);
		//解析请求对象,将请求分成几个部分FileItem
		try {
			List<FileItem> list=fileUpload.parseRequest(request);
			//遍历集合,获得各个部分的对象
			for(FileItem fileItem:list) {
				if(fileItem.isFormField()) {
					String name=fileItem.getFieldName();
					String value=fileItem.getString("UTF-8");
					map.put(name, value);
					System.out.println(map);
				}else {
					String fileName=fileItem.getName();
					String uuidFileName=UploadUtils.getUuidFileName(fileName);
					InputStream is=fileItem.getInputStream();
					String path=getServletContext().getRealPath("/upload");
					String url= path+"\\"+uuidFileName;
					map.put("path", request.getContextPath()+"/upload/"+uuidFileName);
					OutputStream os=new FileOutputStream(url);
					int len=0;
					byte[] b=new byte[1024];
					while((len=is.read(b))!=-1) {
						os.write(b, 0, len);
					}
					is.close();
					os.close();
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Book book=new Book();
		book.setBookId(map.get("bookId"));
		book.setBookName(map.get("bookName"));
		book.setPrice(Float.parseFloat(map.get("bookPrice")));
		book.setDescription(map.get("remarks"));
		book.setPath(map.get("path"));
		response.sendRedirect(request.getContextPath()+"/bookList.jsp");
	
	}

}

显示错误的地方是这里

OutputStream os=new FileOutputStream(url);

正在回答 回答被采纳积分+1

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

4回答
提问者 Mr__Gao 2019-09-02 17:03:39
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>    
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>图书后台管理</title>
        <link rel="stylesheet" href="css/index.css">
        <link rel="stylesheet" href="css/bootstrap.min.css">
      
    </head>

    <body>
       <header>
            <div class="container">
                    <nav>
                            <a href="${pageContext.request.contextPath}/bookList.jsp" >图书信息管理</a>
                    </nav>
                    <nav>
                            <a href="${pageContext.request.contextPath}/categoryList.jsp" >分类管理</a>
                    </nav>
                   
            </div>
        </header>
        <section class="banner">
            <div class="container">
                <div>
                    <h1>图书管理系统</h1>
                    <p>图书信息管理</p>
                </div>
            </div>
        </section>
        <section class="main">


            <div class="container">
                <form class="form-horizontal" action="/searchBook" method="post">
                <div class="form-group"  style="float: right;">
                    <div class="col-sm-offset-2 col-sm-10">
                        <button type="submit" class="btn btn-primary">查询</button>&nbsp;&nbsp;&nbsp;
                    </div>
                </div>
                <div class="form-group" style="float: right;width: 300px;">
                    <div class="col-sm-8">
                        <input name="searchContent" class="form-control" id="searchContent"
                        placeholder="输入要查询的分类" style="width: 250px">
                    </div>
                </div>

                
            </form>
            </div>
            <div class="container">

                <table class="table table-striped">
                    <thead>
                    <tr>
                        <th>序号</th>
                        <th>图书编号</th>
                        <th>图书名称</th>
                        <th>分类</th>
                        <th>价格</th>
                        <th>图书封面</th>
                        <th>操作</th>

                    </tr>
                    </thead>
                    <tbody>
                        <c:forEach items="${sessionScope.bookList }" var="bookList" varStatus="idx">
                        <c:if test="${sessionScope.bookList!=null}"></c:if>
                            <tr id="${idx.index+1}">
                                <td>${idx.index+1}</td>
                                <td>${bookList.bookId}</td>
                                <td>${bookList.bookName}</td>
                                <td>${bookList.categoryBook}</td>
                                <td>¥${bookList.price}</td>
                                <td><img src="${bookList.path}"></td>
                                <td>
                                <a href="/updateBook?bookId=book0001">修改</a>
                                <a href="/deleteBook?bookId=book0001">删除</a>

                                </td>
                                <!--在循环显示数据时,此处的book0001可以用EL表达式进行替换-->

                            </tr>
                        </c:forEach>
                    </tbody>
                </table>
            </div>
        </section>
        <section class="page">
            <div class="container">
                <div id="fatie">
                    <a href="${pageContext.request.contextPath}/addBook.jsp"><button>新建</button></a>
                </div>
            </div>
        </section>
        <footer>
            copy@慕课网
        </footer>
    </body>
</html>

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

老师,我在bookList。jsp中用<c:foreach>显示上传后的图片出现一个500的错误。

我在控制台能够得到图片的地址,但是在显示的时候就这样了

  • 同学你好。先确认一下这个地址的图片打开是不是这个500的图片呢~
    2019-09-02 17:51:25
  • 提问者 Mr__Gao 回复 芝芝兰兰 #2
    是的呢,其他都能显示出来,就是这个图片没显示出来,然后我在booklist中加了一个td显示这个图片的地址,也能显示这个图片的地址,但是图片本身就src中图片就没显示出来,就显示这个500的错误,我还将io重新buld path也不行
    2019-09-02 18:06:09
  • 芝芝兰兰 回复 提问者 Mr__Gao #3
    同学你好。是指本地D:\java\apache-tomcat-8.5.43\webapps\testpro\upload文件夹中,同学输出路径对应的图片会不会就是这张“500错误”的图片呢?
    2019-09-02 18:19:21
芝芝兰兰 2019-09-02 16:28:36

同学你好。因为Tomcat的热部署只会检查已经存在的文件的改变。

这个upload同学是在将testpro添加到Tomcat之前还是之后创建的呢?

目前这种情况,应该停下Tomcat,将testpro从Tomcat中Remove出来
http://img1.sycdn.imooc.com//climg/5d6cd23d0001773c05250612.jpg

使用Eclipse的头部Project->clean... 然后再Build一下。

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

重新将其Add进入Tomcat中,重启Tomcat试一下~

如果解答了同学的疑问,望采纳~

祝学习愉快~


  • 提问者 Mr__Gao #1
    老师,您看下上边的。在显示图片的时候出现一个500的错误
    2019-09-02 17:04:10
提问者 Mr__Gao 2019-09-02 13:01:11
package com.imooc.web.servlet;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.imooc.mainclass.Book;
import com.imooc.utils.UploadUtils;

@WebServlet("/addBookServlet")
public class addBookServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
 
    public addBookServlet() {
        super();
       
    }

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		Map<String,String> map=new HashMap<String,String>();
		//创建磁盘文件项工厂
		DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();
		//创建核心解析类
		ServletFileUpload fileUpload=new ServletFileUpload(diskFileItemFactory);
		//解析请求对象,将请求分成几个部分FileItem
		try {
			List<FileItem> list=fileUpload.parseRequest(request);
			//遍历集合,获得各个部分的对象
			for(FileItem fileItem:list) {
				if(fileItem.isFormField()) {
					String name=fileItem.getFieldName();
					String value=fileItem.getString("UTF-8");
					map.put(name, value);
					System.out.println(map);
				}else {
					String fileName=fileItem.getName();
					System.out.println(fileName);
					String uuidFileName=UploadUtils.getUuidFileName(fileName);
					System.out.println(uuidFileName);
					InputStream is=fileItem.getInputStream();
					String path=getServletContext().getRealPath("/upload");
					System.out.println(path);
					String url= path+"\\"+uuidFileName;
					System.out.println(url);
					map.put("path", request.getContextPath()+"/upload/"+uuidFileName);
					OutputStream os=new FileOutputStream(url);
					int len=0;
					byte[] b=new byte[1024];
					while((len=is.read(b))!=-1) {
						os.write(b, 0, len);
					}
					is.close();
					os.close();
				}
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Book book=new Book();
		book.setBookId(map.get("bookId"));
		book.setBookName(map.get("bookName"));
		book.setPrice(Float.parseFloat(map.get("bookPrice")));
		book.setDescription(map.get("remarks"));
		book.setPath(map.get("path"));
		response.sendRedirect(request.getContextPath()+"/bookList.jsp");
	
	}

}
package com.imooc.utils;

import java.util.UUID;

public class UploadUtils {
	public static String getUuidFileName(String fileName) {
		int idx=fileName.lastIndexOf(".");
		String exName=fileName.substring(idx);
		String UUidFileName=UUID.randomUUID().toString().replace("-", "")+exName;
		return UUidFileName;
	}

}

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

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

控制台输出的信息都有,就是没保存到upload文件夹中

  • 同学你好。请确认一下D:\java\apache-tomcat-8.5.43\webapps\testpro\upload文件夹存在吗?FileOutputStream不能创建多级文件的,如果upload文件夹不存在,那么就需要停掉Tomcat,清理缓存,重新编译。在重启Tomcat。祝学习愉快~
    2019-09-02 15:40:52
  • 提问者 Mr__Gao 回复 芝芝兰兰 #2
    老师,我去这个文件夹看了下没有upload文件夹。这是为什么呢? 我在j2ee中的项目下webcontent中创建了upload,为什么在阿帕奇的webapps\testpro中没有这个文件夹呢
    2019-09-02 15:58:20
芝芝兰兰 2019-09-02 11:45:52

同学你好。首先要确定自己的项目中有没有upload文件夹,可以将filename、path、uuidFileName都使用System.out.println输出一下看看。这些路径都存在吗?是否有错误或者null

另外,目录中如果含有中文,可能会导致错误,可以将中文的路径,经如下转换,如:

path = URIDecoder.decode(path,"utf-8");

如果还是报错,同学可以将自己的UploadUtils类、调试及报错信息,复制粘贴出来。并且将项目的目录结构截个图。注意不要直接贴在回复中,会丧失代码格式。可以以回答这个问题的方式贴入~

祝学习愉快~

  • 提问者 Mr__Gao #1
    都有,我粘贴到上边的回复中了
    2019-09-02 13:01:55
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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