Servlet文件上传

本文转自:http://blog.csdn.net/zx404068203/article/details/6033101

我们学的是表单文件上传,就是在一个FORM中提交相应的信息,和之前我们的提交的注册信息之类的表单是不同的,所以要先改变一下FORM的属性,enctype="multipart/form-data“,这个属性告诉服务器,我们是要提交文件了,而不是一个表单。

   在服务器端也需要判断下
   boolean isUpload = ServletFileUpload.isMultipartContent(request);
   判断请求中是否有这种标示。

2:<input type=“file” />这是表单中用来选择上传文件用的,在表单中有这个元素后,会会自动生成一个输入框和一个按钮,作用和awt中的FileDialog类的作用蛮像的。

3:我们主要使用Commons-fileupload.jar中的类,commons-io是提供流服务用的,我们没有对它进行操作。
主要使用的如下:

FileItem-------DiskFileItemFactory-----ServletFileUpload

作用:
FileItem            用来封装表单中的元素和数据。

ServletFileUpload   处理表单数据,将数据封装到 FileItem 对象中。

DiskFileItemFactory FileItem 对象的工厂,可以设定缓冲区大小和存放临时文件目录。

ServletFileUpload   处理上传的文件的数据,优先保存在缓冲区,如果数据超过了缓冲区大小,则保存到硬盘上,存储在DiskFileItemFactory指定目录下的临时文件。数据都接收完后,它再在从临时文件中将数据写入到上传文件目录下的指定文件中,并删除临时文件。

4:几个小功能

   限制上传文件的大小
   long MAXSIZE=1024*1024*3; 单位是byte,所以这里指定的是3M
   upload.setFileSizeMax(MAXSIZE);

   设定临时目录
   DiskFileItemFactory factory = new DiskFileItemFactory();
   factory.setSizeThreshold(1024*1024);          设定了1M的缓冲区
   factory.setRepository(new File("E:/temp"));   设置上传文件的临时目录
   如果上传的文件小于1M,那么文件就在缓冲区中,然后写入硬盘,不经过缓冲区。这样也就不用   硬盘的读写了,应该比较快。

   定义服务器能接受的文件类型。
   String[] allowTypes = new String[]{"jpg","jpeg"};
   用数组定义可接受文件的后缀名,在读取表单内容后,取得客户端上传文件的全名,再截取后缀   名,取到最后一个.的下标,再拿到之后所有的字符串:
   String endName= fileName.substring(fileName.lastIndexOf(".")+1);
   用数组遍历,如果不在数组中有定义,那么就不接受。
   throw new RuntimeException("文件类型["+endName+"],不支持");
  
最基本的代码实现:
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {   
List<FileItem> items = upload.parseRequest(request); //解析request请求
Iterator iter = items.iterator();
while (iter.hasNext()) {
   FileItem item = (FileItem) iter.next();
         if (item.isFormField()) {                     //如果是表单域 ,就是非文件上传元素
   String name = item.getFieldName();            //获取name属性的值
   String value = item.getString();              //获取value属性的值
} else {
   String fieldName = item.getFieldName();      //文件域中name属性的值
   String fileName = item.getName();            //文件的全路径,绝对路径名加文件名          
   String contentType = item.getContentType(); //文件的类型
   long size = item.getSize();                  //文件的大小,以字节为单位
   File saveFile = new File("D:/test.jpg");      //定义一个file指向一个具体的文件
   item.write(saveFile);                        //把上传的内容写到一个文件中
        
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet文件上传功能可以通过使用注解@MultipartConfig将Servlet标识为支持文件上传,然后将multipart/form-data的POST请求封装成Part对象,通过Part对象对上传的文件进行操作。以下是一个文件上传Servlet示例代码: ```java @WebServlet("/uploadServlet") @MultipartConfig // 如果是文件上传,必须要设置该注解! public class UploadServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("文件上传..."); // 设置请求的编码格式 req.setCharacterEncoding("UTF-8"); // 获取普通表单项(获取参数) String uname = req.getParameter("uname"); // 表单中表单元素的name属性值 System.out.println("uname: " + uname); // 获取Part对象(Servlet将multipart/form-data的POST请求封装成Part对象) Part part = req.getPart("myfile"); // 通过Part对象得到上传的文件名 String fileName = part.getSubmittedFileName(); System.out.println("上传文件名:" + fileName); // 得到文件存放的路径 String filePath = req.getServletContext().getRealPath("/"); System.out.println("文件存放路径:" + filePath); // 上传文件到指定目录 part.write(filePath + "/" + fileName); } } ``` 而文件下载功能可以通过设置download属性来实现。以下是一个文件下载的JSP页面的示例代码: ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>文件下载</title> </head> <body> <!-- 浏览器能够识别的资源 --> <a href="download/hello.txt">文本文件</a> <a href="download/pic.jpg">图片文件</a> <!-- 浏览器不能够识别的资源 --> <a href="download/zzz.rar">压缩文件</a> <hr> <a href="download/hello.txt" download>文本文件</a> <a href="download/pic.jpg" download="test.png">图片文件</a> <hr> <form action="downloadServlet"> 文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名"> <button>下载</button> </form> </body> </html> ``` 以上是文件上传和下载的实现方法,你可以根据需要进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值