我是个小白,现在就是做了一个小的项目,没有用任何的框架,代码都写在前台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();
}}
%>
<%@ 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();
}}
%>
时间:以服务器时间为准,不用客户端设置
用户; 加一个filter处理用户的登陆/session处理,把用户信息放到httpsession中,上传处理action就可以从httpsession中拿到用户
老哥 你说的没错 我知道90-93行可以处理 关键是我不知道该怎么处理啊 我尝试打印出来 可是我得到的数据好像都在一个字符串里面了 split也不好使 求解~~~
<input type="textArea" name="time" >time就是92行的name,输入值就是93行的value
比如我有三四个属性 时间 文件描述 文件作者等等
这个时候 输出name 和 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里面 不然我拿到数据之后 不能存到数据库呀 老大 求解 给分!!!!
页面from表单enctype="multipart/form-data"
上传拦截器加一个
后面action file接收一下