上传文件到服务器的例子(编号280)做不了
发表在JavaWeb图书答疑 2020-09-04 《Java Web开发实战1200例(第Ⅰ卷)》第11章 文件基本操作及文件上传下载
是否精华
版块置顶:

上传页面:

-------------------------------------------------------------------------------------

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>上传文件到服务器</title>


<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">    

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta http-equiv="description" content="This is my page">

<!--

<link rel="stylesheet" type="text/css" href="styles.css">

-->

<script type="text/javascript">

function checkM(myform){

if(myform.file.value==""){

alert("请选择文件!");myform.file.focus();return false;

}

}

</script>

<script type="text/javascript">

function getFilePath(file){

var filePath;

file.select();

try{

filePath = document.selection.createRange().text;//获得文件的本地路径

finally{

document.selection.empty();

}

return filePath;

}

function upload(){

var file = document.getElementById("filePath");

var str =  getFilePath(file);

document.getElementById("pathStr").value =encodeURI(str);

}

</script>

  </head>

  

  <body>

  <form action="save.jsp" method="post" enctype="multipart/form-data" name="form1" onsubmit="return checkM(form1)">

    <table height="112" background="bg.jpg" border="0" cellspacing="0" cellpadding="0">

    <tr><td height="30"></td></tr>

      <tr>

       

        <td colspan="2"><input type="hidden" name="pathStr" id="pathStr"></td>

      </tr>

      <tr>

        <td>选择文件:</td>

        <td><input type="file" name="file" id="filePath"></td>

      </tr>

      <tr align="center">

        <td colspan="2"><input type="submit" name="Submit" onclick="upload()" value="上 传"></td>

      </tr>

    </table>

  </form>

  </body>

</html>







接收保存页面:

---------------------------------------------------------------------------------------------------

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


<%@ page import="com.lh.util.FileUploadUtil" %>

<%@ page import="java.io.*" %>

<%@page import="java.net.URLDecoder"%>

<%

FileUploadUtil uploadUtil = new FileUploadUtil(); //创建UploadBean对象,用于解析表单数据 

uploadUtil.setRequest(request); //将请求对象传入到 UploadBean对象中 

String filePath = uploadUtil.getParameter("pathStr"); //文件路径字符串

filePath=URLDecoder.decode(filePath,"UTF-8"); //对编码过的字符串进行解码

File file = new File(filePath); //根据文件路径创建File对象 

String fileName = file.getName(); //获取文件名

String uploaFile = uploadUtil.getParameter("file"); //文件

String uploadPath = application.getRealPath("/"); //服务器路径作为上传路径

boolean res = uploadUtil.uploadToServer(uploaFile,fileName,uploadPath);

if(res){

out.println("<script>alert('文件上传成功!');");

out.println("window.location.href='index.jsp';");

out.println("</script>");

}

%>






分享到:
精彩评论 5
坚_1599277924
学分:5 LV1
2020-09-04
沙发

接收文件的类:

--------------------------------------------------------------------------------------------------

package com.lh.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

public class FileUploadUtil {
	private InputStream InputStreamState;//输入流
	private HttpServletRequest request;//从JSP页面传入的Request
	private long fileSize;//文件大小
	private String errorMessage = "";//用于保存错误信息
	private Map<String, String> parameter = new HashMap<String, String>();//创建Map集合
	public FileUploadUtil() {
	}


	private void resolverForm() {
		InputStream inputStream = null;
		try {
			inputStream = request.getInputStream();
		} catch (IOException e2) {
			e2.printStackTrace();
		}
		String contentType = request.getContentType();
		if (!isMultipar(contentType) || inputStream.equals(InputStreamState))
			return;
		if (contentType != null && inputStream != null) {
			InputStreamState = inputStream;
			int data;
			StringBuffer datastr = new StringBuffer();
			parameter.clear();
			try {
				while ((data = inputStream.read()) != -1) {
					datastr.append((char) data);
					if (fileSize > 0 && datastr.length() > fileSize) {
						datastr = null;
						errorMessage = "文件超出大小限制。";
						parameter.put("error", errorMessage);
						throw new Exception("文件超出大小限制。");
					} else
						parameter.put("error", errorMessage);
				}
				inputStream.close();
				String split = "boundary=";
				String splitStr = "--"
						+ contentType.substring(contentType.indexOf(split)
								+ split.length());
				String[] formFileds = datastr.toString().split(
						"Content-Disposition: form-data; ");
				for (int i = 0; i < formFileds.length; i++) {
					int[] index = new int[4];
					if (!formFileds[i].startsWith(splitStr)) {
						index[0] = -1;
						index[1] = formFileds[i].indexOf("\n", index[0]);
						index[2] = formFileds[i].indexOf("\n", index[1] + 1);
						index[3] = formFileds[i].indexOf("\n", index[2] + 1);
						String name = "";
						for (int lc = 0; lc < index.length - 1; lc++) {
							String line = formFileds[i].substring(
									index[lc] + 1, index[lc + 1]);
							String[] lineFields = line.split("; ");
							for (int j = 0; j < lineFields.length; j++) {
								if (lineFields[j].startsWith("name=")) {
									name = lineFields[j].substring(
											lineFields[j].indexOf("\"") + 1,
											lineFields[j].lastIndexOf("\""));
								}
								if (j > 0) {
									String arg = name
											+ "_"
											+ lineFields[j].substring(0,
													lineFields[j].indexOf("="));
									String argContent = lineFields[j]
											.substring(lineFields[j]
													.indexOf("\"") + 1,
													lineFields[j]
															.lastIndexOf("\""));
									parameter.put(arg, argContent);
								}
							}
							if (line.equals("\r")) {
								parameter.put(name, formFileds[i].substring(
										index[lc + 1] + 1, formFileds[i]
												.lastIndexOf(splitStr) - 2));
								break;
							}
						}
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public boolean uploadToFile(String filearg, String filename, String filePath) {
		if (filename == null || filename.equals("")) {
			filename = System.currentTimeMillis()
					+ new File(getParameter(filearg + "_filename")).getName();
		}
		String contentType = request.getContentType();
		if (!isMultipar(contentType))
			return false;
		resolverForm();
		if (filePath.charAt(filePath.length() - 1) != File.separatorChar)
			filePath += File.separatorChar;
		String submit = getParameter("Submit");
		String file = getParameter(filearg);
		if (submit != null && file != null) {
			try {
				File newfile = new File(new String((filePath + new File(
						filename).getName()).getBytes("iso-8859-1")));
				newfile.createNewFile();
				FileOutputStream fout = new FileOutputStream(newfile);
				fout.write(file.getBytes("iso-8859-1"));
				fout.close();
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return true;
		}
		return false;
	}
	
	public boolean uploadToServer(String file, String filename, String uploadPath) {
		filename = System.currentTimeMillis()+ "_"+filename;//文件重命名
		resolverForm();
		try {
			File dir = new File(uploadPath+"/upload/");
			if(!dir.exists())//测试此目录是否存在
				dir.mkdir();//创建文件夹
			File newFile = new File(dir.getAbsolutePath()+"/"+filename);//创建文件
			if(!newFile.exists())//测试此文件是否存在
				newFile.createNewFile();//创建文件
			FileOutputStream fos = new FileOutputStream(newFile);//创建文件输出流对象
			fos.write(file.getBytes("iso-8859-1"));//向文件输出流中输出文件字节数据
			fos.close();//关闭流
			return true;
		} catch (Exception ex) {
			ex.printStackTrace();
			return false;
		} 
			
	}
	
	public String getParameter(String param) {
		resolverForm();
		return parameter.get(param);
	}

	
	public Set<String> getParameterNames() {
		resolverForm();
		return parameter.keySet();
	}
	private boolean isMultipar(String contentType) {
		try {
			if (contentType != null
					&& !contentType.startsWith("multipart/form-data")) {
				throw new Exception(
						"请设置Form表单的enctype属性为:\"multipart/form-data\"");
			} else {
				return true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	
	public void setRequest(HttpServletRequest request) {
		this.request = request;
	}

	public void setFileSize(long fileSize) {
		this.fileSize = fileSize;
	}
}


坚_1599277924
学分:5 LV1
2020-09-04
板凳

不论是什么路径上传的文件,路径都变成了C:\fakepath\+文件名的形式,查询了下,这是浏览器的安全设置问题。

不知js要怎么处理才可以获得正确的路径。


另外,我将隐藏input域的value直接的改成一个真实的文件路径,接收的类也接收失败,上传不了。


希望有老师可以解惑。谢谢。

根号申
学分:4736 LV12
TA的每日心情
2021-07-16 23:48:46
2020-09-05
地板

我并没有还原出你的问题。这个实例写的不好,想学习上传文件,建议看看common-fileupload组件或者Servlet 3.0提供的上传文件功能

坚_1599277924
学分:5 LV1
2020-09-05
4L

根号申 发表于2020-09-05 09:27

我并没有还原出你的问题。这个实例写的不好,想学习上传文件,建议看看common-fileupload组件或者Servlet 3.0提供的上传文件功能

现在首先是客户端的浏览器那里,type 为file的input控件取不到文件的真实路径,百度一下c:\fakepath,有不少这样的问题,但是,没有找到很好的解决方案

根号申
学分:4736 LV12
TA的每日心情
2021-07-16 23:48:46
2020-09-07
5L

我使用谷歌浏览器,没有出现你这个问题

首页上一页 1 下一页尾页 5 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照