关于绝对路径出错的问题

关于绝对路径出错的问题

H:\apache-tomcat-8.5.45-windows-x64\apache-tomcat-8.5.45\webapps\shop\shop\upload\983608edb6d14fa4aada63d6eada214c.jpg

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

上面的是系统输出的realpath,可以看到有两个shop,所以我估计File file=new File(realpath);方法中也没能获得file对象,那么这是为什么呢,下面是代码截图

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

正在回答

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

6回答

同学你好,这里应该是设置path时有项目名,在获取realpath时多了一个shop。建议同学使用替换第一个/shop即可,例如:

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

 realpath = realPath.replaceFirst("/shop", "");

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

好帮手慕阿莹 2019-11-25 14:13:43

同学你好,老师怀疑在这里设置path的时候,这个request.getContextPath()+"/upload/"+uuidFileName 中多包含了一个shop,建议同学把这个request.getContextPath()+"/upload/"+uuidFileName 写个输出语句,输入一下试试。

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

如果是这里出现了问题,我们可以用这个url这个变量替换一下request.getContextPath()+"/upload/"+uuidFileName  呢?


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


  • path=/shop/upload/8e45c8c721924c3b822896dd5db43ba3.jpg,这是Path的输出结果,在输出Product对象的时候看得到的,然后就是String realpath=this.getServletContext().getRealPath(path);了,麻烦老师看看
    2019-11-26 12:03:26
提问者 不停奔跑的小恐龙 2019-11-25 11:05:02
package com.imooc.utils;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

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;

/**
 * 文件上传的工具类
 * 
 */
public class UploadUtils {

	/**
	 * 生成唯一的文件名:
	 */
	public static String getUUIDFileName(String fileName){
		// 将文件名的前面部分进行截取:xx.jpg   --->   .jpg
		int idx = fileName.lastIndexOf(".");
		String extention = fileName.substring(idx);
		String uuidFileName = UUID.randomUUID().toString().replace("-", "")+extention;
		return uuidFileName;
	}
	
	public static Map uploadFile(HttpServletRequest request) throws IOException {
		Map<String,String> map = new HashMap<String,String>();
		// 1.创建一个磁盘文件项工厂对象
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		// 2.创建一个核心解析类
		ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
		// 3.解析request请求,返回的是List集合,List集合中存放的是FileItem对象
		String url = null;
		String uuidFileName= null;
		try {
			List<FileItem> list = servletFileUpload.parseRequest(request);
			for (FileItem fileItem : list) {
				if(fileItem.isFormField()){
					// 不是文件上传
					// 接收表单项参数的值:
					String name = fileItem.getFieldName(); // 获得表单项的name属性的值
					String value = fileItem.getString("UTF-8");// 获得表单项的值
					// 存入集合
					map.put(name, value);
				}else{
					// 文件上传
					// 文件上传项:
					// 文件上传功能:
					// 获得文件上传的名称:
					String fileName = fileItem.getName();
					System.out.println("filename="+fileName);
					if(fileName !=null && !"".equals(fileName)){
						// 通过工具类获得唯一文件名:
						uuidFileName = UploadUtils.getUUIDFileName(fileName);
						// 获得文件上传的数据:
						InputStream is = fileItem.getInputStream();
						// 获得文件上传的路径:
						String path = request.getServletContext().getRealPath("/upload");
						// 将输入流对接到输出流就可以了:
						url = path+"\\"+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();
						
						map.put("path", request.getContextPath()+"/upload/"+uuidFileName);
						map.put("filename", fileName);
					}
					System.out.println(map);
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
		
		return map;
	}
	
	public static void main(String[] args) {
		System.out.println(getUUIDFileName("1.jpg"));
	}
}


提问者 不停奔跑的小恐龙 2019-11-24 16:15:44

老师这个是Path的值:H:\apache-tomcat-8.5.45-windows-x64\apache-tomcat-8.5.45\webapps\shop\shop\upload\983608edb6d14fa4aada63d6eada214c.jpg。

这个upload就是放图片的文件夹

这是上传的代码
private void save(HttpServletRequest request, HttpServletResponse response) throws IOException {
		System.out.println("==============");
		Map<String ,String> map=UploadUtils.uploadFile(request);
		Product product=new Product();
		product.setAuthor(map.get("author"));
		product.setPname(map.get("pname"));
		product.setPrice(Double.parseDouble(map.get("price")));
		product.setDescription(map.get("description"));
		product.setFilename(map.get("filename"));
		product.setPath(map.get("path"));
		product.getCategory().setCid(Integer.parseInt(map.get("cid")));
		
		ProductService productService=new ProductServiceImpl();
		productService.save(product);
		response.sendRedirect(request.getContextPath()+"/ProductServlet?method=findAll");
	}

下面是项目路径

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

下面是项目目录

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

  • 还有文件上传的代码哦,老师想看看你存图片的时候,写的路径是不是错了,因为path中取出来也是两个shop的,说明存的时候写的路径可能就有问题。注意不要贴在回复里,会失去代码的格式。可以在回答里贴一下。祝学习愉快。
    2019-11-24 17:31:13
  • 老师是指文件上传的全部代码哦,例如:UploadUtils
    2019-11-24 17:33:58
  • 已经回复到回答区,麻烦老师看一下
    2019-11-25 11:05:24
提问者 不停奔跑的小恐龙 2019-11-23 18:11:09
private void delete(HttpServletRequest request, HttpServletResponse response) throws IOException {
		Integer pid=Integer.parseInt(request.getParameter("pid"));
		System.out.println(pid);
		ProductService productService=new ProductServiceImpl();
		
		Product product=productService.findOne(pid);
		System.out.println(product);
		productService.delete(pid);
		String path=product.getPath();
		
		String realpath=this.getServletContext().getRealPath(path);
		System.out.println(realpath);
		File file=new File(realpath);
		
		if(file.exists()){
			file.delete();
			System.out.println("文件已经删除");
		}else {
			System.out.println("未执行操作");
		}
		
		response.sendRedirect(request.getContextPath()+"/ProductServlet?method=findAll");
	}

我输出的path是图片的服务器路径,realpath是磁盘路径

  • 同学你好,同学有些误解老师的问题了,老师是想问,同学输出一下这个path的具体值是什么呢?(主要是怀疑这个path值就以及包含了两个shop,怀疑是上传的时候路径写的有问题哦)另外一截图一下你的项目目录,以及贴一下文件上传部分的全部代码哦,同学贴的代码比较少,老师无法确认问题哦,注意不要贴在回复里,会失去代码的格式。可以在回答里贴一下。祝学习愉快。
    2019-11-23 19:17:43
  • 已经回复麻烦老师看一下谢谢
    2019-11-24 16:16:05
好帮手慕阿莹 2019-11-23 09:45:22

同学你好,请问同学输出的product中的path是什么呢?

请同时输出一下这个path是什么呢?

建议同学将文件上传部分的代码以及同学贴图的代码部分全部贴一下,老师再看一下。

注意不要贴在回复里,会失去代码的格式。可以在回答里贴一下。祝学习愉快。


  • 我回复在回答里面了,麻烦老师看一下,谢谢
    2019-11-23 18:11:39
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

帮助反馈 APP下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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