Struts文件上传和一些小问题

#碎碎念# 2017-09-19 10:39:44
我是个小白,现在就是做了一个小的项目,没有用任何的框架,代码都写在前台jsp页面了(大佬们先不要吐槽这里),现在有个功能 就是我要实现上传文件的功能 一开始 用的是Tomcat自带的文件上传功能 但是 我想在上传文件的同时 一并上传这个文件的相关信息 比如作者 比如上传时间 或者 上传文件的详细介绍等等...代码我会贴上的 郁闷的是 用Tomcat 上传 form表单 只能接受单纯的文件 我自己设置的<input type="hidden" name="time" value=<%=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())%>这种的 后台都获取不到数据 都是空值 但是文件却能够正常的上传 然后 我现在想用Struts2的上传功能 但是 当我部署到现在的项目上面时 以前能正常运行的页面 全都404了 该怎么办呢? 综上就是 因为我现在的项目 没有用任何框架 但我现在因为上传文件这个功能 必须使用Struts2的这一个小功能 然后 整个项目不能正常运行了 我该怎么办? 怎么才能让他们互相兼容呢? 我的项目没有任何框架!

下面贴 Tomcat上传的代码 如果能用Tomcat的上传功能实现我说的内容 那我就真的太感谢了

<%@page import="org.apache.commons.lang.StringUtils"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page language="java" import="entity.*,util.*"%>
<%@ page import="java.io.*" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page import="org.apache.commons.fileupload.ProgressListener" %>
<%@ page import="java.util.*" %>
<%@ page import="org.apache.commons.fileupload.FileItem" %>

<%

request.setCharacterEncoding("utf-8");

String time = request.getParameter("upload-time");
System.out.print("time = " + time);




//配置
int MEMORY_THRESHOLD = 1024 * 1024 * 3;
int MAX_FILE_SIZE = 1024 * 1024 * 100;
int MAX_QUEST_SIZE = 1024 * 1024 * 120;




String savePath = this.getServletContext().getRealPath("WEB-INF/upload");
System.out.println(savePath);

// 临时文件保存目录
String tempPath = this.getServletContext().getRealPath("WEB-INF/upload/temp");

// 如果不存在则创建
File tempFile = new File(tempPath);
if (!tempFile.exists()) {
tempFile.mkdir();
}


// 配置上传参数
DiskFileItemFactory factory = new DiskFileItemFactory();

// 设置内存临界值,超出后将产生临时文件并存储目录
factory.setSizeThreshold(MEMORY_THRESHOLD);
// 设置临时存储目录
factory.setRepository(tempFile);

ServletFileUpload upload = new ServletFileUpload(factory);

upload.setProgressListener(new ProgressListener() {

@Override
public void update(long pByteRead, long pContentLength, int arg2) {
System.out.println("文件大小:" + pContentLength + ",当前已处理:" + pByteRead);
}
});

// 设置最大文件上传值
upload.setFileSizeMax(MAX_FILE_SIZE);
// 设置最大请求值
upload.setSizeMax(MAX_QUEST_SIZE);
// 中文
upload.setHeaderEncoding("utf-8");

// 判断是否为表单上传的数据
if (!ServletFileUpload.isMultipartContent(request)) {
PrintWriter writer = response.getWriter();
writer.println("Error: 表单必须包含 enctype=multipart/form-data");
writer.flush();
return;
}

String message = "";




List<FileItem> item = upload.parseRequest(request);
if (item != null && item.size() > 0) {




// 迭代表单数据
for (FileItem fileitem : item) {


// 处理不在表单中的字段
if (fileitem.isFormField()) {
String name = fileitem.getFieldName();
String value = fileitem.getString("utf-8");

//System.out.println(value);





} else {
String filename = fileitem.getName();
System.out.println(filename);
if (filename == null || filename.trim().equals("")) {
continue;
}
// 获取文件名
filename = filename.substring(filename.lastIndexOf("\\") + 1);
System.out.println("上传的文件名为:" + filename);
// 获取文件扩展名
String fileExtName = filename.substring(filename.lastIndexOf(".") + 1);
System.out.println("上传的文件扩展名为:" + fileExtName);

message = "文件上传成功";

saveFile(fileExtName, filename, savePath, fileitem);

}
}
}

%>


<%!

//为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
private String makeFileName(String filename) {
String uuid_name = UUID.randomUUID().toString() + "_" + filename;
return uuid_name;
}

%>


<%!

private void saveFile(String fileExtName, String filename, String savePath, FileItem fileitem) {

String finalPath = "";

try {

if (fileExtName.equals("jpg") || fileExtName.equals("jpeg") || fileExtName.equals("png")
|| fileExtName.equals("gif") || fileExtName.equals("GIF") || fileExtName.equals("bmp")) {
System.out.println("上传文件的扩展名:" + fileExtName);
finalPath = savePath + "/image";

} else if (fileExtName.equals("avi") || fileExtName.equals("mp4") || fileExtName.equals("MP4")
|| fileExtName.equals("rmvb") || fileExtName.equals("mkv")) {
finalPath = savePath + "/video";
} else if (fileExtName.equals("mp3") || fileExtName.equals("wav") || fileExtName.equals("ape")
|| fileExtName.equals("flac") || fileExtName.equals("wma")) {
finalPath = savePath + "/audio";
} else if (fileExtName.equals("txt") || fileExtName.equals("rtf") || fileExtName.equals("doc")
|| fileExtName.equals("xls") || fileExtName.equals("ppt") || fileExtName.equals("pdf")
|| fileExtName.equals("html") || fileExtName.equals("htm")) {
finalPath = savePath + "/texts";
}

File path = new File(finalPath);
if (!path.exists()) {
path.mkdirs();
}

InputStream in = fileitem.getInputStream();

// 得到文件保存的名称
String saveFilename = makeFileName(filename);
// 得到文件的保存目录
// String realSavePath = makePath(saveFilename, saveImage);
// 创建一个文件输出流
FileOutputStream out = new FileOutputStream(finalPath + "\\" + saveFilename);
// 创建一个缓冲区
byte buffer[] = new byte[1024];
// 判断输入流中的数据是否读完
int length = 0;
// 输入流读入到缓存区
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
in.close();
out.close();

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

}


%>

...全文
152 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianfang 2017-09-26
  • 打赏
  • 举报
回复
你在打印表单参数下面就写map.put,你写到处理文件的地方,当然表单参数都是空了
coooliang 2017-09-26
  • 打赏
  • 举报
回复
有了struts上传应该是非常简单的吧,都不用写代码。 页面from表单enctype="multipart/form-data" 上传拦截器加一个 后面action file接收一下
tianfang 2017-09-26
  • 打赏
  • 举报
回复
是因为先处理了文件,后处理的其他form 字段
tianfang 2017-09-25
  • 打赏
  • 举报
回复
在括号外面定义变量,括号里对变量赋值,就可以把值传递到括号外了
#碎碎念# 2017-09-25
  • 打赏
  • 举报
回复
引用 8 楼 tianfang 的回复:
在括号外面定义变量,括号里对变量赋值,就可以把值传递到括号外了
我也是这么想的 结果 到了括号外面就变成了空值! 不信你试试我这段代码!! 老大 求教!
#碎碎念# 2017-09-24
  • 打赏
  • 举报
回复
引用 6 楼 tianfang 的回复:
87行是个对所有form input做遍历,你可以用 if name==作者 的方式做多个判断,然后存到你自己的变量中 一个字符串也是有规则的, key=value之间是=分隔,多个参数用&分隔 你可以先用split &分割一次,每个key=value 再用=分割
谢谢大哥!!!非常感谢 解决了 不过现在有个 新的问题 直接给你上代码吧
List<FileItem> item = upload.parseRequest(request);
	if (item != null && item.size() > 0) {
		
		String info = "";
		String author = "";
		String date = "";
		String type = "";
		String name = "";

	Map<String, String[]> map = new HashMap<String, String[]>();
	
	List<String> name_list = new ArrayList<String>(); 
		
		// 迭代表单数据
		for (FileItem fileitem : item) {

			// 处理不在表单中的字段
			if (fileitem.isFormField()) {
				String file_name = fileitem.getFieldName();
				String file_value = fileitem.getString("utf-8");
				
				if(name.equals("file-name")){
					name = file_value;
					System.out.println("上传文件名称:" + name);
				}

				if (file_name.equals("file-info")) {
					info = file_value;
					System.out.println("上传信息:" + info);

				} else if (file_name.equals("upload-time")) {
					date = file_value;
					System.out.println("上传时间:" + date);

				} else if (file_name.equals("upload-author")) {
					author = file_value;
					System.out.println("上传作者:" + author);

				} else if (file_name.equals("upload-type")) {
					type = file_value;
					System.out.print("上传类型:" + type);
				} 

			} else {
				String filename = fileitem.getName();
				System.out.println(filename);
				if (filename == null || filename.trim().equals("")) {
					continue;
				}
				// 获取文件名
				filename = filename.substring(filename.lastIndexOf("\\") + 1);
				System.out.println("上传的文件名为:" + filename);
				// 获取文件扩展名
				String fileExtName = filename.substring(filename.lastIndexOf(".") + 1);
				System.out.println("上传的文件扩展名为:" + fileExtName);

				message = "文件上传成功";

				saveFile(fileExtName, filename, savePath, fileitem);
				
				System.out.println("数据库存储时间:" + date);
				
				
				map.put("name", new String[]{name});
				map.put("type", new String[]{type});
				//map.put("size", size_list.get(0));
				map.put("date", new String[]{date});
				map.put("author", new String[]{author});
				map.put("info", new String[]{info});

				File_Res file = File_Res.createModel(File_Res.class, map);
				if (file.save()) {
					System.out.print("插入一条文件数据");
				}
就是map里面都是空值 我知道好像是变量作用域的问题 这个我不知道该怎么解决 怎么把里面的值 传到括号外面呢? 就是把if里面的值 传到else里面 不然我拿到数据之后 不能存到数据库呀 老大 求解 给分!!!!
tianfang 2017-09-21
  • 打赏
  • 举报
回复
87行是个对所有form input做遍历,你可以用 if name==作者 的方式做多个判断,然后存到你自己的变量中 一个字符串也是有规则的, key=value之间是=分隔,多个参数用&分隔 你可以先用split &分割一次,每个key=value 再用=分割
#碎碎念# 2017-09-20
  • 打赏
  • 举报
回复
引用 1 楼 tianfang 的回复:
90-93行就是处理其他form数据的,修改一下就可以用 时间:以服务器时间为准,不用客户端设置 用户; 加一个filter处理用户的登陆/session处理,把用户信息放到httpsession中,上传处理action就可以从httpsession中拿到用户
老哥 你说的没错 我知道90-93行可以处理 关键是我不知道该怎么处理啊 我尝试打印出来 可是我得到的数据好像都在一个字符串里面了 split也不好使 求解~~~
#碎碎念# 2017-09-20
  • 打赏
  • 举报
回复
老哥 你说的没错 我知道90-93行可以处理 关键是我不知道该怎么处理啊 我尝试打印出来 可是我得到的数据好像都在一个字符串里面了 split也不好使 求解~~~
tianfang 2017-09-20
  • 打赏
  • 举报
回复
90-93行就是处理其他form数据的,修改一下就可以用 时间:以服务器时间为准,不用客户端设置 用户; 加一个filter处理用户的登陆/session处理,把用户信息放到httpsession中,上传处理action就可以从httpsession中拿到用户
#碎碎念# 2017-09-20
  • 打赏
  • 举报
回复
引用 4 楼 tianfang 的回复:
例如 <input type="textArea" name="time" > time就是92行的name,输入值就是93行的value
是啊 这个我知道 可是我不只是只有这一个属性啊 比如我有三四个属性 时间 文件描述 文件作者等等 这个时候 输出name 和 value 就是全变成了一个字符串 老哥 这个我不知道怎么把他们分别拿出来用 求解!!!老哥 我好着急呀
tianfang 2017-09-20
  • 打赏
  • 举报
回复
例如 <input type="textArea" name="time" > time就是92行的name,输入值就是93行的value

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧