JSP&&SERVLET学习笔记(七):Servlet处理上传的文件

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;

import javax.swing.text.Position;

@WebServlet("/upload.do")

public class UploadServlet extends HttpServlet {

private byte[] readBody(HttpServletRequest request) throws IOException{

int formDataLength = request.getContentLength();

//取得ServletInputStream对象

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;

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

//读取请求Body

byte[] body = readBody(request);

//获取所有Body内容的字符串表示

String textBody = new String(body, "ISO-8859-1");

//取得上传的文件名称

String filename = getFilename(textBody);

//取得文件开始与结束的位置

Position p = getFilePosition(request, textBody);

//输出至文件

writeTo(filename, body, p);

}

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);

}

class Position{

int begin;

int end;

Position(int begin, int end){

this.begin = begin;

this.end = 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));

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

}

}

时间: 2025-01-02 13:26:47

JSP&&SERVLET学习笔记(七):Servlet处理上传的文件的相关文章

树莓派学习笔记——定时向yeelink上传树莓派CPU温度

0 前言 本文通过python文件IO操作获得树莓派CPU温度信息,通过python request库周期性向yeelink平台上传温度,修改rc.local脚本使得该python脚本在开机时便在后台运行,向平台每5分钟上报一次温度信息. 网上查阅了很多关于linux开机启动的博文,尝试了几遍居然发现方法都无法实现开机启动效果.我想可能是操作系统或开发环境的微小差异产生的,如果发现博文中的内容存在问题,请及时留言,我查证之后定当修改. [相关博文] [树莓派学习笔记--获取树莓派CPU温度] [

struts2学习笔记之十七(上传文件)

文件上传 传统的文件上传 (1)需要将form设置为multipart/form-data:此时会将整个表单以二进制流的方式提交:接下来就无法将通过request.getParameter()来获取请求参数. (2)需要启用一个文件上传组件(SmartUpload,Common-FileUpload等) (3)Servlet通过文件上传组件来获取请求参数,获取上传文件. 得到上传文件之后,以IO流的方式把文件写入磁盘 Servlet3.0之后的文件上传 只需要增加一个@MultipartConf

《Servlet学习笔记》Servlet生命周期和调用

    学习技术有时会感觉很枯燥,有时感觉很绕,N多调用,不好理解,但如果能画出图来,就可以一目了然. 图比文字更容易让人接受,并产生深刻印象.一张图可以包含很多东西. 下面一些图来自于网络,偶然间发现,感觉让人忽然明白并回忆起了好多. Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后: Web服务器首先检查是否已经装载并创建了该Servlet的实例对象.如果是,则直接执行第四步,否则,执行第二步: 装载并创建该Servlet的一个实例对象: 调用Serv

《Servlet学习笔记》Servlet 简介

Servlet 简介:Servlet是sun公司提供的一门用于开发动态web资源的技术.Sun公司在其API中提供了一个servlet接口,用户若想开发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下两步:1.编写一个Java类,实现servlet接口:2.把开发好的Java类部署到web服务器中. jsp就是servletjavase.javaee,servlet不属于javase而属于javaeeservlet专门文档APITomcat可以运行servlet,lib

(Servlet学习笔记)Servlet的小范例

Web.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-nam

《Servlet学习笔记》Servlet开发细节

Servlet开发细节1.由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成.2.<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Serv

《Servlet学习笔记》Servlet接口实现类

Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet.HttpServlet. HttpServlet指能够处理HTTP请求的Servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大.因此开发人员在开发Servlet的时候,通常应该继承这个类,而避免直接去实现Servlet接口. HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GE

servlet学习笔记02 servlet类、对象

1.servlet主要类和接口的结构如下图所示: servlet常用类和接口javax.servlet.Servlet接口:规定了必须由servlet类实现由servlet引擎识别和管理的方法集,基本目标是提供生命周期方法init().service()和destroy()方法.Servlet接口中方法:void init(ServletConfig config)throws ServletException:在servlet被载入后和实施服务前由servlet引擎进行1次调用,如果产生Una

C#使用七牛云存储上传下载文件

项目需要将音视频文件上传服务器,考虑并发要求高,通过七牛来实现. 直接上代码 using Qiniu.IO; using Qiniu.IO.Resumable; using Qiniu.RPC; using Qiniu.RS; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace qiniuTest

Other - 02 - Servlet学习笔记 - 异步Servlet

异步Servlet Servlet默认情况下都是同步的,但是Servlet可以进行异步的调用. /** * Servlet implementation class MainServlet */ @WebServlet(value = "/MainServlet", asyncSupported = true) public class AsynServlet extends HttpServlet { private static final long serialVersionUI