关于getRealPath的问题

关于getRealPath的问题

package com.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.web.domain.Book;
import com.web.utils.UploadUtils;




@WebServlet("/add.do")
public class AddBookServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		Map<String, String> map=new HashMap<String, String>();
		DiskFileItemFactory diskFileItemFactory=new DiskFileItemFactory();
		ServletFileUpload fileUpload=new ServletFileUpload(diskFileItemFactory);
		try {
			List<FileItem> list=fileUpload.parseRequest(request);
			for(FileItem f:list) {
				if(f.isFormField()) {
					map.put(f.getFieldName(), f.getString("UTF-8"));
				}else {
					//文件上传
					//获得文件名
					String fileName=f.getName();
					//得到随机文件名
					String uuidFileName=UploadUtils.getUuidFileName(fileName);
					//获得文件输入流
					InputStream is=f.getInputStream();
					//将文件写入服务器的某个路径即可
					String path=getServletContext().getRealPath("/upload");
					System.out.println(path);
					String url=path+"\\"+uuidFileName;
					//创建输出流和输入流进行对接
					map.put("path",getServletContext()+"/upload/"+uuidFileName);
					System.out.println(url);
					byte[] b=new byte[1024];
					int len=0;
					OutputStream os=new FileOutputStream(url);
					while((len=is.read(b))!=-1) {
						os.write(b, 0, len);
					}
					is.close();
					os.close();
				}
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Book book=new Book();
		book.setBookId(map.get("bookId"));
		book.setBookName(map.get("bookName"));
		book.setCategoryId(map.get("categoryId"));
		book.setBookPrice(map.get("bookPrice"));
		book.setBookInfo(map.get("remarks"));
		book.setPath(map.get("path"));
		System.out.println(book);
		request.getRequestDispatcher("/bookList.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

我一直没搞懂这个getRealPath到底是哪个地址,getRealPath指的是服务器所在地址吗,那服务器所在地址和文件目录地址不是同一个地址是分开的对吗,有点理不清楚这地址的关系了

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

正在回答

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

3回答

同学可以这么理解但是有些不是很准确,同学还记的之前的课程中有讲过项目的部署地址吗?

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

在tomcat的安装与配置讲过,这里就是同学项目最终会部署的地址。同学可以看课程回顾一下https://class.imooc.com/lesson/715#mid=17790 

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

好帮手慕柯南 2019-08-13 11:19:46

同学你好!

  1. getRealPath获取到的是项目部署在tomcat上的真实路径,也就是磁盘路径。

  2. 同学两次输出的不同的原因是因为,同学两次保存输出的地址都不同呢,第一次输出时使用了getRealPath来获取,第二次保存时并没有使用getRealPath。同学在map添加时直接添加之前的拼接的url即可

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

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 慕设计2030095 #1
    所以发布项目的时候,tomcat会在磁盘里新建一个路径在这个路径发布,不是在项目的地址发布,所以读取或者存储到的数据也是在新建的这个路径里面对吗
    2019-08-13 11:23:33
shameL 2019-08-13 07:48:56

webapp里面你项目的地址里面的

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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