java servlet 文件上传

 后台代码:

package com.lk.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
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.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;

public class UploadServlet extends HttpServlet {

 /**
  * 文件上传
  */
 private static final long serialVersionUID = 1L;

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doPost(request,response);
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.setContentType("text/html");
  request.setCharacterEncoding("utf-8");
  response.setCharacterEncoding("utf-8");
  //解析request对象
  DiskFileUpload dfu = new DiskFileUpload();
  //存放上传文件路径
  List<String> fileUrls = new ArrayList<String>();
  try {
   //解析request中表单所有值放入集合中
   List<FileItem> fileItems = dfu.parseRequest(request);
   for (FileItem fileItem :fileItems) {
    if(fileItem.isFormField()){//如果是文本域
     if("desc1".equals(fileItem.getFieldName())){
      InputStream in =  fileItem.getInputStream();
      byte[] bt = new byte[in.available()];
      in.read(bt);
      in.close();
      //获取文本域值
      String desc1 = new String(bt,"utf-8");
      System.out.println(desc1);
     }
     if("desc2".equals(fileItem.getFieldName())){
      InputStream in =  fileItem.getInputStream();
      byte[] bt = new byte[in.available()];
      in.read(bt);
      in.close();
      //获取文本域值
      String desc2 = new String(bt,"utf-8");
      System.out.println(desc2);
     }
    }else{//否则为文件域
     //打印保存上传文件路径
     System.out.println(this.getServletContext().getRealPath("upload"));
     
//     if("file1".equals(fileItem.getFieldName())){
     if(fileItem.getName()!=null&&!"".equals(fileItem.getName())){
      //客户端文件
      File remoteFile = new File(fileItem.getName());
     
      //上传文件在服务器端的路径保存集合中
      fileUrls.add(request.getContextPath()+"/upload/"+remoteFile.getName());
      //定义服务器下文件
      File servFile = new File(this.getServletContext().getRealPath("upload"),remoteFile.getName());
      //创建文件夹
      servFile.getParentFile().mkdirs();
      //读取客户端文件输入流
      InputStream in =  fileItem.getInputStream();
      //定义写入服务器文件流
      OutputStream os = new FileOutputStream(servFile);
      //定义字节数组
      byte[] bt = new byte[in.available()];
      //对流进行读和写
      for (;;) {
       int len = in.read(bt);
       if(len==-1){
        break;
       }
       os.write(bt, 0, len);
      }
      //关闭输入输出流
      if(os!=null){
       os.flush();
       os.close();
      }
      if(in!=null){
       in.close();
      }
     }
//     }
    }
   }
  } catch (FileUploadException e) {
   e.printStackTrace();
  }
  PrintWriter out = response.getWriter();
  out.print("上传成功!");
  out.print("<br>");
  for (int i = 0; i < fileUrls.size(); i++) {
   out.print("<a href='"+fileUrls.get(i)+"' target=_blank>上传文件"+(i+1)+"</a>");
   out.print("<br>");
  }
  out.flush();
  out.close();
 }

}


 

jsp前台代码

<form action="UploadServlet" method="post" enctype="multipart/form-data">
      <div align="center" ><br/>
      <fieldset style="width:40%"><br/>
       <legend>上传文件</legend>
       <p>
       <div align="left">
       文件上传一:
       <input type="file" name="file1"/><br/>
       文件一说明:<input type="text" name="desc1">
       </div><p>
       <div align="left">
       文件上传二:
       <input type="file" name="file2"/><br/>
       文件二说明:<input type="text" name="desc2">
       </div>
      </fieldset>
      <input type="submit" value=" 上传文件   ">
      </div>
     </form>

所用到jar

commons-fileupload.jar

commons-io.jar

 

浏览器打开中文文件名的问题解决

解决办法:

第一步,修改tomcat的服务器配置文件(server.xml)
在connector上加入:URIEncoding="UTF-8"
加入后的结果形式如下:

<Connector port="8080" maxHttpHeaderSize="8192"
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" redirectPort="8443" acceptCount="100"
           connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>

第二步,重新启动tomcat
第三步,修改IE的配置参数
在IE菜单的“工具”-->“internet选项”中,
将“总是以utf-8发送URL”前的勾号选上,
第四步,关闭所有IE窗口,重新打开IE。

如果是Apache与Tomcat配合搭建web平台的,还要修改(或加入)ajp连接器的URIEncoding选项。 】

希望碰到类似问题的朋友们注意。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值