Servlet中使用getInputStream进行文件上传

据说古老了点,所以代码比较繁琐,主要用于处理文件的地方太多。

下节用SERVLET3.0的Part进行操作一下。

form.html:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html ;charset=UTF-8">
</head>
<body>
  <form method="post" action="upload.do" enctype="multipart/form-data">
    file: <input type="file" name="filename" value="" /><br>
    <input type="submit" value="Upload" name="upload" />
  </form>
</body>
</html>

uploadServlet.java:

package cc.openhome;

import java.io.DataInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/upload.do")
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public UploadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        byte[] body = readBody(request);
        String textBody = new String(body, "ISO-8859-1");
        String filename = getFilename(textBody);
        Position p = getFilePosition(request, textBody);
        writeTo(filename, body, p);
    }

    class Position {
          int begin;
          int end;
          Position(int begin, int end) {
            this.begin = begin;
            this.end = end;
          }
    }

    private byte[] readBody(HttpServletRequest request)
            throws IOException{
        int formDataLength = request.getContentLength();
        DataInputStream dataStream = new DataInputStream(request.getInputStream());
        byte body[] = new byte[formDataLength];
        int totalBytes = 0;
        while (totalBytes < formDataLength) {
        int bytes = dataStream.read(body, totalBytes, formDataLength);
        totalBytes += bytes;
        }
        return body;
    }

    private Position getFilePosition(HttpServletRequest request, String textBody) throws IOException {

    String contentType = request.getContentType();
    String boundaryText = contentType.substring(
            contentType.lastIndexOf("=") + 1, contentType.length());
    int pos = textBody.indexOf("filename=\"");
    pos = textBody.indexOf("\n", pos) + 1;
    pos = textBody.indexOf("\n", pos) + 1;
    pos = textBody.indexOf("\n", pos) + 1;
    int boundaryLoc = textBody.indexOf(boundaryText, pos) -4;
    int begin = ((textBody.substring(0,
            pos)).getBytes("ISO-8859-1")).length;
    int end = ((textBody.substring(0,
            boundaryLoc)).getBytes("ISO-8859-1")).length;

    return new Position(begin, end);
    }

    private String getFilename(String reqBody) {
        String filename = reqBody.substring(
                reqBody.indexOf("filename=\"") + 10);
        filename = filename.substring(0, filename.indexOf("\n"));
        filename = filename.substring(
                filename.lastIndexOf("\\") + 1, filename.indexOf("\""));
        return filename;
    }

    private void writeTo(String filename, byte[] body, Position p)
        throws FileNotFoundException, IOException {
        FileOutputStream fileOutputStream =
                new FileOutputStream("c:/workspace/" + filename);
        fileOutputStream.write(body, p.begin, (p.end - p.begin));
        fileOutputStream.flush();
        fileOutputStream.close();

    }

}

时间: 2024-10-06 05:27:18

Servlet中使用getInputStream进行文件上传的相关文章

JAVA中使用FTPClient实现文件上传下载实例代码_java

在java程序开发中,ftp用的比较多,经常打交道,比如说向FTP服务器上传文件.下载文件,本文给大家介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 一.上传文件 原理就不介绍了,大家直接看代码吧 /** * Description: 向FTP服务器上传文件 * @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保(cuihongbao@d-heaven.com)创建 * @param url F

.Net中FileUpload控件文件上传与验证实用例子

最简单的fileupload控件上传图片例子  代码如下 复制代码 using System.IO; protected void Button1_Click(object sender, EventArgs e) { Boolean fileOk = false; //指定文件路径,pic是项目下的一个文件夹:-表示当前网页所在的文件夹 String path = Server.MapPath("~/");//物理文件路径 //文件上传控件中如果已经包含文件 if (FileUplo

linux中SFTP 用法(实现文件上传下载)

FTP 诸君大概都用过,SFTP 用过的估计比较少.简单说,它就是 ftp 前加个 secure,通过 ssh 通道在本地及远程服务器间进行文件传输,更为安全. 连接 ssh 的连接通常是这样: ssh sam@zfanw.com 然后输入密码. sftp 基本就是把 ssh 换作 sftp: sftp sam@zfanw.com 如果配置了 ssh 的 config 文件,使用私钥/公钥的形式连接远程服务器,则更简单了: sftp linode 连接完成后,终端显示: sftp > 下载文件

Servlet3.0中使用getPart进行文件上传

这个先进些,简单些,但书上提供的例子不能使用,到处弄了弄才行. servlet代码: package cc.openhome; import java.io.InputStream; import java.io.OutputStream; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.File; import java.io.IOException; import ja

分享两个小代码:ibatis简单示例和在浏览器中同时选中多文件上传

本文代码一概以不担保,免责(也就是不管你遇到任何问题,都与本人无关)的方式提供,内容仅供参考. 友情提示: 下载微软网盘文件时关闭下载工具,  否则你将得到错误的文件, 双击 EXE 会出来 DOS 窗口. 正确操作是点击文件名后能看到显示下载链接和文件大小等信息.   http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/Public/ibatis/ibatis.zip  IMB 这是个我写的iBATIS的入门单表映射例子,MySQL开

关于SpringMVC中使用MutipartFile实现文件上传的问题

问题描述 小弟最近刚开始接触SpringMVC,现在想实现这样一个功能:通过MutipartFile从前台获取一个文件流(MultipartFileimgFile=mhsr.getFile("uploadfile");),指定两个目录path1,path2,然后再将这个文件分别放在path1和path2两个目录下,我是采用imgFile.transferTo(newFile(path1));imgFile.和transferTo(newFile(path2));来做的,但是执行之后,只

Spring MVC 多文件上传大小限制及异常处理

Spring MVC  多文件上传大小限制及异常处理 (包括 MaxUploadSizeExceededException 异常) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 补充如下: h

SpringMVC案例3----spring3.0项目拦截器、ajax、文件上传应用

依旧是项目结构图和所需jar包图: 显示配置文件hib-config.xml [html] view plain copy  print? <?xml version="1.0" encoding="UTF-8"?>   <beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/X

Spring MVC 之文件上传(七)

SpringMVC同样使用了apache的文件上传组件.所以需要引入以下包: apache-commons-fileupload.jar apache-commons-io.jar 在springAnnotation-servlet.xml中配置 1 <!-- 定义文件上传解析器 --> 2 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.Common