我想把文件上传到webroot下的一个叫upload的文件夹下。请问怎么获取upload的路径?
request.setCharacterEncoding("utf-8");
//这里对request进行封装,RequestContext提供了对request多个访问方法
RequestContext requestContext = new ServletRequestContext(request);
//判断表单是否是Multipart类型的。这里可以直接对request进行判断,不过已经以前的用法了
if (FileUpload.isMultipartContent(requestContext)) { DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件的缓存路径
File d = new File("D:/temp");
if(!d.exists()){
d.mkdirs();
} factory.setRepository(d);
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件大小的上限,-1表示无上限 upload.setSizeMax(-1);
List items = new ArrayList();
try {
//上传文件,并解析出所有的表单字段,包括普通字段和文件字段 items = upload.parseRequest(request);
} catch (FileUploadException e1) {
System.out.println("上传发生异常" + e1.getMessage());
}
//下面对每个字段进行处理,分普通字段和文件字段
Iterator it = items.iterator();
while (it.hasNext()) {
FileItem fileItem = (FileItem) it.next();
//如果是普通字段
if (fileItem.isFormField()) {
System.out.println("文本框的name属性:"
+ fileItem.getFieldName()
+ "\n文件名:"
+ fileItem.getName()
+ "\n上传的文件路径:"
+ new String(fileItem.getString().getBytes(
"iso8859-1"), "utf-8"));
} else {
System.out.println("文本框的name属性:"
+ fileItem.getFieldName() + "\n文件名:"
+ fileItem.getName() + "\n是否在内存中:"
+ fileItem.isInMemory() + "\n文件类型:"
+ fileItem.getContentType() + "\n文件大小:"
+ fileItem.getSize());
//保存文件,其实就是把缓存里的数据写到目标路径下
if (fileItem.getName() != null && fileItem.getSize() != 0) {
File fullFile = new File(fileItem.getName());
File newFile = new File("D:\\upload"+ fullFile.getName());//想换成webroot下的upload路径。。
try {
fileItem.write(newFile);
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("文件没有选择 或 文件内容为空");
}
}
System.out.println("============================================="); } }
request.setCharacterEncoding("utf-8");
//这里对request进行封装,RequestContext提供了对request多个访问方法
RequestContext requestContext = new ServletRequestContext(request);
//判断表单是否是Multipart类型的。这里可以直接对request进行判断,不过已经以前的用法了
if (FileUpload.isMultipartContent(requestContext)) { DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件的缓存路径
File d = new File("D:/temp");
if(!d.exists()){
d.mkdirs();
} factory.setRepository(d);
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件大小的上限,-1表示无上限 upload.setSizeMax(-1);
List items = new ArrayList();
try {
//上传文件,并解析出所有的表单字段,包括普通字段和文件字段 items = upload.parseRequest(request);
} catch (FileUploadException e1) {
System.out.println("上传发生异常" + e1.getMessage());
}
//下面对每个字段进行处理,分普通字段和文件字段
Iterator it = items.iterator();
while (it.hasNext()) {
FileItem fileItem = (FileItem) it.next();
//如果是普通字段
if (fileItem.isFormField()) {
System.out.println("文本框的name属性:"
+ fileItem.getFieldName()
+ "\n文件名:"
+ fileItem.getName()
+ "\n上传的文件路径:"
+ new String(fileItem.getString().getBytes(
"iso8859-1"), "utf-8"));
} else {
System.out.println("文本框的name属性:"
+ fileItem.getFieldName() + "\n文件名:"
+ fileItem.getName() + "\n是否在内存中:"
+ fileItem.isInMemory() + "\n文件类型:"
+ fileItem.getContentType() + "\n文件大小:"
+ fileItem.getSize());
//保存文件,其实就是把缓存里的数据写到目标路径下
if (fileItem.getName() != null && fileItem.getSize() != 0) {
File fullFile = new File(fileItem.getName());
File newFile = new File("D:\\upload"+ fullFile.getName());//想换成webroot下的upload路径。。
try {
fileItem.write(newFile);
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("文件没有选择 或 文件内容为空");
}
}
System.out.println("============================================="); } }
解决方案 »
- 持久层框架?
- java script 给jsp传数组过去
- Output parameters have not yet been processed. Call getMoreResults()
- 想学个JAVA语言,问一下,有人知道需求JAVA程序员的公司有哪些吗?最好是在珠海或者珠三角地区的。谢谢
- jstl <c:foreach> 如何对应for循环
- 免费的Java .net php 空间供应,申请人数有限,先到先得!
- 服务器上出现空指针?
- schema 中关于数据类型 求救!
- 关于Struts中传参数的问题
- 新手问题:为什么我这样编译出错。
- CXF WebServices
- Java过滤器url-pattern 配置问题
结果:E:\Tomcat\webapps\TEST
(2)得到IE地址栏地址:request.getRequestURL()
结果:http://localhost:8080/TEST/test
(3)得到相对地址:request.getRequestURI()
结果:/TEST/test
http://hi.baidu.com/java1016/blog/item/dfe50807964eac7c030881b6.html
老师这样写的可以。 openStream ?为什么呢?怎么让传上去的文件名和之前一样的?package com.cstp.upload;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class for Servlet: FileUpload1
*
*/
public class FileUpload1 extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;
private String path;
public FileUpload1() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(ServletFileUpload.isMultipartContent(request)){
FileItemFactory dfif=new DiskFileItemFactory(); System.out.println("=================================================");
PrintWriter w = response.getWriter();
ServletFileUpload dfu=new ServletFileUpload(dfif);
dfu.setHeaderEncoding("utf-8");
try {
FileItemIterator item = dfu.getItemIterator(request);
while(item.hasNext()){
FileItemStream obj = item.next();
System.out.print("是否为普通文本框:"+obj.isFormField()+"\t");
System.out.print("\n文本框的name属性:"+obj.getFieldName()+"\t");
System.out.println("\n文件类型:"+obj.getContentType());
if(!obj.isFormField()){
InputStream in = obj.openStream();
System.out.println("\n被上传文件路径:"+obj.getName());
if(obj.getName().trim().length()<1)
continue;
//File file=new File(path);
File file = File.createTempFile("temp_",obj.getName().substring(obj.getName().lastIndexOf('.')),new File(path));
OutputStream out = new FileOutputStream(file);
int i;
while((i=in.read())!=-1)
out.write(i);
System.out.println("\n存放文件的路径:"+file.getAbsolutePath());
out.close();
w.println("<img src='./upload/"+file.getName()+"'>");
}
System.out.println("-------------------------------------------------------------------------------");
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
} @Override
public void init() throws ServletException {
super.init();
System.out.println(super.getServletContext().getRealPath("/upload"));
path=super.getInitParameter("path");
}
}
可不可以直接部署网站,而不是不网站放到war包里。这样不就行了。
上传后 webroot下的upload文件夹里看不到,但是去上传的绝对路径也就是程序中的path:D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\FileUpload\upload 可以看到上传成功了,但是找到项目的路径D:\workspace\FileUpload\WebContent\upload是没有的,所以在项目里怎么刷新也看不到。老师说是一个是开发路径,一个是实际路径。直接用,是可以得到的,只是在项目里看不到。我看的视频,那个风中叶老师的struts2视频的第13讲,可以看到,可能是MyEclipse的视图和Eclipse的视频不一样吧。但是确实可以引用到。像success.jsp就拿到了。效果图我没传。嘿嘿如果想在D:\workspace\FileUpload\WebContent\upload看到,在web.xml文件里的servlet节点里servlet-class后配置里加上参数表示D:\workspace\FileUpload\WebContent\upload ,原因就是内部认识虚拟路径,是吧!