`
josico
  • 浏览: 43204 次
社区版块
存档分类
最新评论

commons-fileupload对来自不同系统客户端文件传输的细微差别

阅读更多

用commons-fileupload进行文件上传,对于不同的系统有略微的差别

 

将得到的FileItem进行迭代,通过getName方式可以得到文件的文件名,但有如下问题需要注意

 

XP系统传输过来,得到的getName是全路径+文件名+后缀名,如:

C:\Documents and Settings\Administrator\My Documents\My Music\god.mp3

 

WIN7系统传输过来,得到的getName只是文件名+后缀名。如:

god.mp3

 

服务器是WIN7

 

一个小知识点,算是写下来,留个印象。

 

 

下面贴上源码

package com.cug.action;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadAction extends HttpServlet {

	public UploadAction() {
		super();
	}

	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request,response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		FileItemFactory factory = new DiskFileItemFactory();
		ServletFileUpload upload = new ServletFileUpload(factory);
		try {
			List items = upload.parseRequest(request);
			Iterator iter = items.iterator();
			while (iter.hasNext()) {
			    FileItem item = (FileItem) iter.next();

			    if (item.isFormField()) { //是表单域

			    } else {
			    	String fileName = item.getName();
			    	System.out.println("fileName  "+fileName);
			    	if(fileName.indexOf("\\")!=-1){
				    	int i = fileName.lastIndexOf("\\");
				    	fileName = fileName.substring(i);
			    	}
			    	System.out.println("fileName  "+fileName);
			    	String path = this.getServletContext().getRealPath("\\upload");
			    	System.out.println("path+fileName  "+path+fileName);
			    	File file = new File(path+"\\"+fileName);
			    	try {
						item.write(file);
					} catch (Exception e) {
						e.printStackTrace();
					}

			    }
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
	}

	public void init() throws ServletException {
		// Put your code here
	}

}

 

 

 

<!--EndFragment-->
1
1
分享到:
评论
3 楼 freezingsky 2012-11-05  
楼主这个说法让我有些疑惑,可能是我从来没有想过获取路径吧。我表示:目前为止,都是获得文件名为目的,至于其路径,没有意义。
2 楼 mfkvfn 2012-11-05  
你可以在XP中使用最新版的Chrome或FireFox试验一下,也得不到文件路径的。
1 楼 mfkvfn 2012-11-05  
与操作系统无关,与浏览器及版本有关。
较新的浏览器认为服务器端并不需要知道客户端系统中文件的路径。这会导致客户端信息被泄漏这是不安全的做法,所以在新的浏览器中取消了文件所在的路径。可以通过在浏览器和安全设置(或高级设置)里进行配置让较新的浏览器中也显示出路径。不过并不建议这么做,建议后台不要知道这个。

相关推荐

Global site tag (gtag.js) - Google Analytics