我是个小白,现在就是做了一个小的项目,没有用任何的框架,代码都写在前台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();
}}
%>

解决方案 »

  1.   

    90-93行就是处理其他form数据的,修改一下就可以用
    时间:以服务器时间为准,不用客户端设置
    用户; 加一个filter处理用户的登陆/session处理,把用户信息放到httpsession中,上传处理action就可以从httpsession中拿到用户
      

  2.   

    老哥 你说的没错  我知道90-93行可以处理  关键是我不知道该怎么处理啊  我尝试打印出来  可是我得到的数据好像都在一个字符串里面了  split也不好使   求解~~~
      

  3.   


    老哥 你说的没错  我知道90-93行可以处理  关键是我不知道该怎么处理啊  我尝试打印出来  可是我得到的数据好像都在一个字符串里面了  split也不好使   求解~~~
      

  4.   

    例如
    <input type="textArea" name="time" >time就是92行的name,输入值就是93行的value
      

  5.   

    是啊  这个我知道  可是我不只是只有这一个属性啊
    比如我有三四个属性  时间   文件描述   文件作者等等    
    这个时候  输出name 和 value 就是全变成了一个字符串   老哥  这个我不知道怎么把他们分别拿出来用   求解!!!老哥  我好着急呀
      

  6.   

    87行是个对所有form input做遍历,你可以用 if  name==作者  的方式做多个判断,然后存到你自己的变量中一个字符串也是有规则的,  key=value之间是=分隔,多个参数用&分隔
    你可以先用split  &分割一次,每个key=value 再用=分割
      

  7.   


    谢谢大哥!!!非常感谢  解决了  不过现在有个  新的问题   直接给你上代码吧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里面  不然我拿到数据之后  不能存到数据库呀  老大  求解  给分!!!!
      

  8.   

    你在打印表单参数下面就写map.put,你写到处理文件的地方,当然表单参数都是空了
      

  9.   

    是因为先处理了文件,后处理的其他form 字段
      

  10.   

    有了struts上传应该是非常简单的吧,都不用写代码。
    页面from表单enctype="multipart/form-data"
    上传拦截器加一个
    后面action file接收一下