JSP文件上传-二进制流详解

合集下载

二进制报文解析

二进制报文解析

二进制报文解析在计算机通信领域中,二进制报文解析是一个重要概念。

它涉及到将传输的二进制数据转化为可读的信息,以便计算机或人类能够理解和处理。

二进制报文是一种由0和1组成的编码形式,用于在计算机网络中传输数据。

它可以表示各种类型的信息,如文本、图像、音频等。

在网络通信中,二进制报文经常被用来传输和接收数据。

要理解二进制报文解析的过程,首先需要了解二进制编码的基本原理。

计算机中的所有数据都以二进制形式表示,即由0和1来表示不同的数值。

例如,一个字节可以表示从0到255的整数值。

在二进制报文解析中,首先需要确定报文的格式和结构。

这通常是通过协议来定义的,协议是一组规则和约定,用于确定报文的各个部分的含义和位置。

一旦确定了报文的格式和结构,就可以开始解析报文。

解析过程通常包括以下几个步骤:1. 报文分割:将接收到的二进制数据按照报文的格式进行分割,以便逐个解析各个部分。

2. 报文解码:根据协议规定的编码方式,将二进制数据转化为可读的文本或其他形式的信息。

这通常涉及到将二进制数据转化为相应的字符或数值。

3. 报文校验:检查报文的完整性和正确性,以确保接收到的数据没有被损坏或篡改。

这通常涉及到计算和比较报文的校验和或哈希值。

4. 报文解析:根据协议规定的规则和约定,解析报文的各个部分,并提取所需的信息。

这通常涉及到查找特定的字段或标记,并将其与相应的含义关联起来。

5. 报文处理:根据解析得到的信息,进行相应的处理和操作。

这可以包括存储数据、显示信息、执行特定的操作等。

通过二进制报文解析,计算机可以有效地传输和处理各种类型的数据。

它在网络通信、数据存储和处理、图像和音频处理等领域都发挥着重要的作用。

虽然二进制报文解析涉及到一些技术细节和复杂性,但它对于计算机通信的正常运作至关重要。

通过合理的结构和规范的解析过程,可以确保数据的准确性和完整性,并提高计算机系统的性能和效率。

二进制报文解析是计算机通信中的重要概念,通过将二进制数据转化为可读的信息,实现了计算机之间的数据传输和处理。

前端解析二进制流

前端解析二进制流

前端解析二进制流以“前端解析二进制流”为标题,写一篇3000字的文章近年来,随着Web技术的发展,Web开发人员开始越来越多地使用二进制流来传输数据,如图像、音频和视频流。

这些数据既不适合HTTP协议的传输,也不能靠简单的文件传输代替。

如果要将数据传输到浏览器,就需要使用二进制流。

即便如此,二进制流也是一个令人头疼的概念,尤其是对于前端工程师来说,前端如何解析这些二进制数据流,以获取有用的数据,是他们面临的一大挑战。

二进制流是什么?二进制流是一种逐字节的传输格式,它不仅用于传输文件,还可以用于传输其他格式的数据,如图像、视频、音频等。

它的优点在于,可以在不需要额外的解析器的情况下直接在浏览器中播放,无需再次转换数据,从而节省时间,提高性能。

如何处理二进制流?在处理二进制流之前,首先要考虑一种可用于处理二进制流的方案。

如果只是简单地将数据转换成二进制字符串,则可以使用Web现有的API,比如XMLHttpRequest、Blob和FileReader等,来实现该目标。

XMLHttpRequest可以从服务器请求并发送二进制流,FileReader可以将以二进制形式读取的文件转换为数据URL形式,而Blob对象则可以存储二进制数据。

然后,我们需要根据所使用的的二进制流的数据结构,来确定如何解析数据。

比如,如果使用的是一种类似于JPEG图像的结构,可以使用JavaScript来按字节解析数据,从而获取图像信息,从而使浏览器能够播放图像。

另外,还可以使用ArrayBuffer实现二进制流的解析,ArrayBuffer允许前端开发人员将多种格式的二进制数据解析为数组,从而获取有用的数据,并且ArrayBuffer可以直接由Web现有的API,如FileReader和XMLHttpRequest访问。

最后,将这些解析好的数组转换成适用的数据类型,并将其储存在浏览器的数据库中,以便未来使用。

从上面可以看出,解析二进制流并不是一件容易的事情,尤其是对于前端工程师来说。

用JSP实现文件上传功能

用JSP实现文件上传功能

用JSP实现文件上传功能JSP(JavaServer Pages)是一种用于在服务器上生成动态网页的Java技术。

通过使用JSP,可以实现文件上传功能,使用户能够将文件上传到服务器。

一、前端页面设计:1.创建一个HTML表单,用于用户选择要上传的文件。

2. 指定表单的enctype属性为“multipart/form-data”,以支持文件上传。

3.添加一个提交按钮,用于触发文件上传的动作。

二、后端代码实现:1.在JSP页面上添加以下代码,用于接收和处理文件上传的请求:```jsp<%String uploadPath = "指定文件上传的目标路径"; // 指定文件上传的目标路径,例如:"/uploads/"DiskFileItemFactory factory = new DiskFileItemFactory(;ServletFileUpload upload = new ServletFileUpload(factory);tryList<FileItem> items = upload.parseRequest(request);for (FileItem item : items)if (!item.isFormField() { // 判断是否为上传文件String fileName = new File(item.getName().getName(;String filePath = uploadPath + File.separator + fileName;File storeFile = new File(filePath);item.write(storeFile); // 保存文件到服务器out.println("文件上传成功!");}}} catch (Exception e)out.println("文件上传失败!");e.printStackTrace(;%>```2. 创建一个文件夹用于存储上传的文件,例如在项目根目录下创建一个名为"uploads"的文件夹。

前端把二进制流文件作为参数传给后端的方法

前端把二进制流文件作为参数传给后端的方法

前端把二进制流文件作为参数传给后端的方法在前端开发中,经常会遇到需要将二进制流文件传递给后端的情况。

这可能是用户上传的图片、文档,或者其他类型的二进制数据。

实现这一过程需要我们了解一些关键的技术和方法,以确保数据能够准确、高效地从前端传递到后端。

首先,我们来谈谈什么是二进制流文件。

简单来说,二进制流文件就是以二进制形式存储的数据,不像文本文件那样可以直接读取和理解其内容。

常见的二进制流文件包括图片(如 JPEG、PNG 等格式)、音频文件(如 MP3 等)、视频文件(如 MP4 等)以及各种文档格式(如 PDF 等)。

在前端,我们可以通过 HTML 的`<input>`元素来获取用户选择的文件。

例如,使用`type="file"`属性创建一个文件选择控件:```html<input type="file" id="fileInput" />```当用户选择了文件后,我们可以通过 JavaScript 来获取这个文件对象。

```javascriptconst fileInput = documentgetElementById('fileInput');const file = fileInputfiles0;```获取到文件对象后,接下来就是将其以二进制流的形式传递给后端。

常见的方法有两种:FormData 和 XMLHttpRequest 。

使用 FormData 是一种比较简单直观的方式。

FormData 可以方便地构建表单数据,包括文件。

```javascriptconst formData = new FormData();formDataappend('file', file);fetch('/upload',{method: 'POST',body: formData})then(response => responsejson())then(data => consolelog(data))catch(error => consoleerror('Error:', error));```在上述代码中,我们创建了一个 FormData 对象,并将文件添加到其中。

element中upload上传的文件二进制转换-概述说明以及解释

element中upload上传的文件二进制转换-概述说明以及解释

element中upload上传的文件二进制转换-概述说明以及解释1.引言1.1 概述概述是一篇文章中的开端,旨在简要介绍文章的主题和目的,为读者提供一个整体的了解。

本文的标题为"element中upload上传的文件二进制转换",主要介绍了在element中使用upload组件进行文件上传,并将上传的文件转换为二进制格式的操作。

在现代Web开发中,文件上传是一个常见的需求。

而element是一套基于Vue.js的UI组件库,提供了丰富的组件和指令,方便开发者构建交互丰富的用户界面。

其中的upload组件封装了文件上传的功能,并支持将文件转换为二进制格式,进一步操作和处理。

本文将会详细介绍element中upload组件的使用方法,并针对上传的文件进行二进制转换的过程进行讲解。

在二进制转换的过程中,我们可以利用JavaScript的Blob对象和FileReader对象,将文件内容转换为二进制数据,以便进行更灵活的处理。

本文的目的是帮助读者理解和掌握在element中使用upload组件进行文件上传,并将上传的文件转换为二进制格式的方法。

通过学习本文,读者将能够在自己的项目中灵活运用这些技巧,实现更加丰富和便捷的文件上传功能。

在接下来的章节中,我们将会详细介绍element中upload组件的用法,包括如何配置和使用该组件进行文件上传。

随后,我们将会着重讲解文件二进制转换的过程,并提供一些实际应用场景的示例代码。

希望本文能够帮助读者更好地理解和应用element中upload组件的文件上传功能,并在实际开发中能够灵活运用文件二进制转换的技巧。

接下来,我们将会开始介绍element中upload上传的文件部分。

1.2 文章结构本文主要讨论在使用element中的upload组件进行文件上传时的文件二进制转换问题。

文章结构如下:1. 引言1.1 概述:介绍element组件库以及其提供的upload组件的作用和功能。

JSP使用输入流和输出流实现文件上传示例

JSP使用输入流和输出流实现文件上传示例

以下代码演示了在JSP页面中使用输入流和输出流实现文件上传1.创建upload.jsp页面:<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <html><head><title>一个简单的文件上传</title></head><body><form action="doUpload.jsp" method="post">标题:<input type="text" name="title"><br>文件位置:<input type="file" name="mfile"><br><input type="submit" value="提交"></form></body></html>2.创建doUpload.jsp页面<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="GBK"%><html><head><title>My JSP 'doUpload.jsp' starting page</title></head><body><%request.setCharacterEncoding("GBK");String title = request.getParameter("title"); //获取页面提交的标题信息String myFile = request.getParameter("mfile"); //获取页面提交的文件int indexOf = stIndexOf("\\"); //获取最后一个“\”所在的索引位String fileName = myFile.substring(indexOf); //获取文件上传的文件名//创建输出流把指定的文件写入WEB工程的upload目录下(需要在WebRoot目录下创建upload目录)。

将文件上传、下载(以二进制流保存到数据库)

将文件上传、下载(以二进制流保存到数据库)

07. {
08. byte[] buffer = null;
09. int result = 0;
10. if (!string.IsNullOrEmpty(filePath))
11. {
12.
String file = HttpContext.Current.Server.MapPath(filePath);
将文件上传、下载(以二进制流保存到数据库)
1、将文件以二进制流的格式写入数据库
首先获得文件路径,然后将文件以二进制读出保存在一个二进制数组中,与数据库建立连接,在SQL语句中将二进制数组赋值给相应的参 数,完成向数据库中写入文件的操作
[csharp]
01. /// 将文件流写入数据库
02. /// </summary>
03. /// <param name="filePath">存入数据库文件的路径</param>
04. /// <param name="id">数据库中插入文件的行标示符ID</param>
05. /// <returns></returns>
06. public int UploadFile(string filePath, string id)
17.
{
18.
mandText = "update DomesticCompanyManage_Main_T set ZBDocumentFile = @fileContents where MainID ='"
19.
cmd.Parameters.AddRange(new[]{

前端解析二进制流

前端解析二进制流

前端解析二进制流近年来,随着前端技术的发展,前端开发者们需要不断地学习和使用新技术。

有了JSON和XML,处理复杂数据变得更容易,但是有时这些技术都不够。

虽然我们可以使用这些技术来处理文本文件,但是当遇到一些特殊的文件时,它们就无法满足我们的需求了。

在这些情况下,前端开发者们就需要学习如何处理二进制流了。

二进制流被定义为一种不连续的字节序列,它们可以用来表示任何类型的数据,包括文本文件、图像文件、视频文件、音频文件等等。

二进制流是一种特殊的文件格式,它们通常被称为二进制数据流。

首先,我们来谈谈前端解析二进制流的具体方法,即如何使用JavaScript或其他语言来处理这类文件。

简单的说,如果你需要处理一个二进制数据流,你可以通过使用流处理API来实现。

在这个API中,你可以使用一些函数,如“read()”,来从流中读取某些特定的数据;或者你可以使用其他函数,如“write()”,来向流中写入数据。

此外,如果你需要处理不同类型的二进制流,你也可以使用流处理框架,比如JavaScript中的node-stream。

这个框架可以帮助你更好地处理不同类型的二进制数据流,它可以帮助你更好地读取、解析和写入不同类型的文件。

另外,如果你需要处理不同格式的二进制流,你也可以使用流处理库,比如JavaScript中的Streaming-Binary。

这个库可以帮助你处理多种类型的二进制数据,并支持多种格式的二进制流,例如JSON、XML、Hex等。

此外,如果你需要处理二进制流,你也可以使用流处理工具,比如Streaming-Binary-Tool或者Node.js中的Buffer。

这些工具可以帮助你快速处理不同类型的二进制数据流,比如文本文件、图像文件、视频文件等。

总之,如果你希望学习如何处理复杂的数据,了解前端解析二进制流就必不可少了。

有了前面提到的流处理API、框架和库,以及流处理工具,你就可以更好地处理这类文件,从而变得更有效率。

js 后端返回的二进制-定义说明解析

js 后端返回的二进制-定义说明解析

js 后端返回的二进制-概述说明以及解释1.引言1.1 概述概述部分的内容如下:在现代的网络开发中,我们经常会遇到需要与后端进行数据交互的情况。

而后端返回的数据往往以文本的形式传输,如JSON或HTML等。

然而,有时候我们也会遇到后端返回的是二进制数据的情况。

二进制数据是一种由0和1组成的数据形式,它与文本数据有着本质的区别。

与文本数据不同的是,二进制数据是以字节(byte)为单位进行存储和传输的。

这种数据形式在某些场景下可以提供更高的效率和更多的功能。

本文将深入探讨后端返回的二进制数据在前端开发中的作用和应用场景。

我们将介绍什么是二进制数据,以及它与文本数据之间的区别。

我们还将详细探讨如何处理后端返回的二进制数据,包括如何解析和处理这些数据,以及如何将其展示给用户。

通过本文的学习,读者将能够更好地理解后端返回的二进制数据的重要性,并能够将其应用于自己的项目中。

无论是处理图像、音频还是视频等多媒体数据,亦或是与硬件设备进行通信,后端返回的二进制数据都能为开发者提供更多的选择和灵活性。

总而言之,本文将围绕后端返回的二进制数据展开讨论,为读者提供深入的理论知识和实践技巧。

通过学习本文,读者将能够更加深入地了解如何处理后端返回的二进制数据,并能够运用这些知识解决实际问题。

让我们一起深入探索吧!1.2 文章结构文章结构部分主要描述了本文所使用的章节结构以及各个章节的内容概要,以便读者能够清晰地了解整篇文章的组织框架。

文章结构的章节安排如下:2.正文2.1 什么是二进制数据2.2 后端返回的二进制数据的作用2.3 如何处理后端返回的二进制数据在本文的正文部分,将介绍与js后端返回的二进制数据相关的内容,主要包括三个章节。

首先,我们将解释什么是二进制数据,包括其基本概念和特点。

接着,我们会探讨后端返回的二进制数据在实际应用中的作用,以及它为开发者带来的好处和应用场景。

最后,我们将介绍如何处理后端返回的二进制数据,包括解码和解析等操作,以及常用的处理方法和工具。

JavaScript读二进制文件并用ajax传输二进制流的方法

JavaScript读二进制文件并用ajax传输二进制流的方法

JavaScript读⼆进制⽂件并⽤ajax传输⼆进制流的⽅法综合⽹上多个教程,加上⾃⼰实践得出的⽅法,⽬前能够兼容⾕歌、IE11、IE10。

htmlbody⾥的内容,没什么特殊的。

<div id="dConfirm"><p style="float: left;margin-left: 20px;margin-top: 20px"><form action="javascript: uploadAndSubmit();" name="demoForm" id="demoForm" method="post" enctype="multipart/form-data"><p>上传⽂件: <input type="file" name="file" id="str_file"/></p><p><input type="submit" value="上传" /></p></form></p></div>读取⼆进制⽂件:function uploadAndSubmit(){filename=document.getElementById("str_file").value;var form = document.forms["demoForm"];if(filename!=""){try{var obj = new ActiveXObject("ADODB.Stream");//这个必然是IE}catch(e){var file = form["file"].files[0];var reader = new FileReader();reader.readAsBinaryString(file);//这个读法是异步的reader.onloadend=function(){// 这个事件在读取结束后,⽆论成功或者失败都会触发if (reader.error) {console.log(reader.error);} else {uploadAndSubmit2(reader.result);}}return;}var bf1=new BinaryFile(filename);//这个读法是同步的uploadAndSubmit2(bf1.ReadAll());}}这⾥要对浏览器类型做⼀下判断,如果不是IE则使⽤FileReader进⾏读取,如果是IE则使⽤activex控件读取。

上传功能以二进制来判断文件后缀java

上传功能以二进制来判断文件后缀java

上传功能以二进制来判断文件后缀java
【实用版】
目录
1.文件上传功能的实现
2.二进制在文件后缀判断中的应用
3.Java 语言在文件上传功能中的使用
正文
在现代互联网应用中,文件上传功能已经成为了一个必不可少的功能。

它能够方便用户上传各种文件,从而实现应用的多样性和灵活性。

在实现文件上传功能的过程中,二进制数据类型的应用和 Java 语言的运用显得尤为重要。

首先,文件上传功能通常需要对上传的文件进行类型和后缀的判断。

这是因为不同的文件类型和后缀可能对应着不同的处理方式和存储方式。

在这个过程中,二进制数据类型发挥了关键作用。

通过将文件的后缀与二进制数据进行比较,可以准确地判断出文件的类型和后缀。

例如,对
于.docx 文件,其二进制数据为 80 9B 7F 6E,而对于.pdf 文件,其二
进制数据为%PDF-开头。

这样,就可以根据文件的后缀来进行相应的处理。

其次,Java 语言在文件上传功能的实现中也发挥了重要作用。

Java 语言作为一种广泛应用的高级编程语言,具有良好的跨平台性和稳定性。

它提供了丰富的网络编程 API,可以方便地进行文件的上传和下载。

同时,Java 语言也具有良好的安全性和可维护性,可以有效地防止各种安全风险,保证应用的稳定运行。

总的来说,文件上传功能是现代互联网应用中不可或缺的一部分。

而二进制数据类型和 Java 语言在其中的应用,更是为文件上传功能的实现提供了强大的技术支持。

第1页共1页。

JSP存储二进制文件和分页技术

JSP存储二进制文件和分页技术

JSP存储二进制文件和分页技术1. 文件存储到数据库将图像以二进制数据格式存储到数据库中,创建bindata的数据表,添加filename(char),binfile(longBlob),当然第一个位置id自动生成,然后创建一个selectImage.jsp页面:<%@page language="java"import="java.util.*"pageEncoding="gb231 2"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName ()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>上传图片</title><meta http-equiv="pragma"content="no-cache"><meta http-equiv="cache-control"content="no-cache"><meta http-equiv="expires"content="0"><meta http-equiv="keywords"content="keyword1,keyword2,keyword3"> <meta http-equiv="description"content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form name="form1"method="post"action="testimage.jsp"> <p align="center">请选择图片的URL: <input type="file"name="image"/> </p><p align="center"><input type="submit"name="Submit"value="提交"/></p></form></body></html>然后创建一个selectImage.jsp页面,提交图片信息<%@page language="java"import="java.util.*"pageEncoding="gb231 2"%><%@page import="java.sql.*"%><%@page import="java.text.*"%><%@page import="java.io.*"%><%@page import="java.nio.*"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName ()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>存储图片</title><meta http-equiv="pragma"content="no-cache"><meta http-equiv="cache-control"content="no-cache"><meta http-equiv="expires"content="0"><meta http-equiv="keywords"content="keyword1,keyword2,keyword3"> <meta http-equiv="description"content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%Class.forName("com.mysql.jdbc.Driver").newInstance(); //加载JDBC驱动程序String url="jdbc:mysql://localhost/firstjsp"; //firstjsp为数据库的名称String user="root";String password="lfw123";String filename=request.getParameter("image");filename="C:\\Documents and Settings\\Administrator\\桌面\\12444033Z-0.jpg";//现在的浏览器上传过来的image就只有名字了,没有绝对路径了!!!File file=new File(filename); //获取表单传过来的图片的urltry{out.println("这里对吧?"+filename+"<br/>");//打开文件FileInputStream fin=new FileInputStream(file);//建一个缓冲保存数据ByteBuffer nbf=ByteBuffer.allocate((int)file.length());byte[] array=new byte[1024];int offset=0, len=0;//读取数据while((len=fin.read(array))>0 ){if(len!=1024) nbf.put(array,0,len);else nbf.put(array);offset+=len;}//新建一个数组保存要写的内容byte[] content=nbf.array();//创建数据库连接out.println("content is "+content+"<br/>");Connection conn=DriverManager.getConnection(url, user, pas sword);//保存数据Statement stmt=conn.createStatement( ResultSet.TYPE_SCROLL _INSENSITIVE, ResultSet.CONCUR_UPDATABLE);String sqlstr="select * from bindata where filename='02'";//查找名字为02的文件ResultSet rs=stmt.executeQuery(sqlstr);if(rs.next()){rs.updateBytes(3,content);rs.updateRow();}else{//如果没有,添加,已经有更新,注意,第一个位置是自动编号,所以在2,3位置rs.moveToInsertRow();rs.updateString(2,"02");rs.updateBytes(3,content);rs.insertRow();}rs.close();fin.close();out.println("恭喜,已经将新的记录成功添加到数据库中!");}catch(FileNotFoundException e){e.printStackTrace();out.println("没找到图片?");}catch(IOException e){e.printStackTrace();out.println("没输入?");}%></body></html>最后创建一个showImage.jsp页面,读取图片:<%@page language="java"import="java.util.*"pageEncoding="gb231 2"%><%@page import="java.sql.*"%><%@page import="java.text.*"%><%@page import="java.io.*"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName ()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>显示图片</title><meta http-equiv="pragma"content="no-cache"><meta http-equiv="cache-control"content="no-cache"><meta http-equiv="expires"content="0"><meta http-equiv="keywords"content="keyword1,keyword2,keyword3"> <meta http-equiv="description"content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%Class.forName("com.mysql.jdbc.Driver");String url="jdbc:mysql://localhost/firstjsp";String user="root";String password="lfw123";Connection conn=DriverManager.getConnection(url,user,password);String sql="select binfile from bindata where filename='02'"; Statement stmt=null;ResultSet rs=null;try{stmt=conn.createStatement();rs=stmt.executeQuery(sql);}catch(SQLException e){out.println("连接OK?");}try{while(rs.next()){response.setContentType("image/jpg");ServletOutputStream sout=response.getOutputStream();InputStream in=rs.getBinaryStream(1); //获取二进制输入流byte[] b=new byte[0x7a120]; //创建byte数组用作缓冲for(int i=in.read(b);i!=-1;){sout.write(b); //写入页面in.read(b); //读取数据}sout.flush();sout.close();}}catch(Exception e){out.println(e);}%></body></html>截图:(long1 vs longpo 转载请注明出处:/lfw2565295@126)(long1 vs longpo 转载请注明出处:/lfw2565295@126)声音,视频也可以二进制数据格式存储到数据库中,方法类似,用到<param>标签等,但这些技术但只是一般的方法,以后能学到更好的(long1 vs longpo 转载请注明出处:/lfw2565295@126) 2. 分页技术使用游标定位,丢弃不属于页面的数据,使用缓存结果集,一次查询所有数据,使用数据库提供的定位集的SQL语句,返回特定行的数据,使用JavaBean实现,建立bean包,然后写个splitPage.java:package bean;import java.sql.*;import java.util.*;public class splitPage {//定义数据库连接对象和结果集对象private Connection con=null;private Statement stmt=null;private ResultSet rs=null;private ResultSetMetaData rsmd=null;//SQL查询语句private String sqlstr;//总记录数目private int rowCount=0;//所分页的逻辑页数private int pageCount=0;//每页显示的记录数目private int pageSize=0;//设置参数值public void setCon(Connection con){this.con=con;if(this.con==null){System.out.println("Failure to get a connection!");}else{System.out.println("Success to get a connection!");}}//初始化,获取数据表中的信息public void initialize(String sql,int pageSize,int ipage){int irows=pageSize*(ipage-1);sqlstr=sql;this.pageSize=pageSize;try{stmt=this.con.createStatement();rs=stmt.executeQuery(this.sqlstr);if(rs!=null){st();this.rowCount=rs.getRow();rs.first();this.pageCount=(this.rowCount-1)/this.pageSize+1; }this.sqlstr=sql+" limit "+irows+","+pageSize;stmt=this.con.createStatement();rs=stmt.executeQuery(this.sqlstr);rsmd=rs.getMetaData();}catch(SQLException e){System.out.println(e.toString());}}//将显示结果存到VECTOR集合类中public Vector getPage(){Vector vData=new Vector();try{if(rs!=null){while(rs.next()){String[] sData=new String[6];for(int j=0; j<rsmd.getColumnCount(); j++){sData[j]=rs.getString(j+1);}vData.addElement(sData);}}rs.close();stmt.close();}catch(SQLException e){System.out.println(e.toString());}return vData;}//获得页面总数public int getPageCount(){return this.pageCount;}//获取数据表中记录总数public int getRowCount(){return this.rowCount;}}建立words数据表,有自动增长的id,有varchar(100)的wtitle,text的wcontent,datetime的wtime,int的uid,不能为空words.jsp:<%@page language="java"import="java.util.*"pageEncoding="gb231 2"%><%@page import="java.sql.*"%><%@page import="java.io.*"%><%@page import="bean.*"%><jsp:useBean id="pages"scope="page"class="bean.splitPage"/><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName ()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN"> <%//每页显示的记录数int pageSize=3;String sql="";//当前页int showPage=1;//数据库用户名,密码String userName="root";String password="lfw123";//数据库的url包括连接数据库所用的编码格式String url="jdbc:mysql://localhost:3306/firstjsp?useUnicode=true& characterEncoding=gb2312";//定义连接对象Connection conn=null;%><%try{//加载驱动程序Class.forName("com.mysql.jdbc.Driver");//获得数据库的连接对象conn=DriverManager.getConnection(url,userName,password);}catch(SQLException e){//打印出异常信息out.println(e.toString());}//给pages中参数con赋值pages.setCon(conn);sql="select * from words order by Id";//查询数据表,获得查询结果String strPage=null;//获取跳转到的目的页面strPage=request.getParameter("showPage");if(strPage==null){showPage=1;}else{try{showPage=Integer.parseInt(strPage);}catch(NumberFormatException e){showPage=1;}}pages.initialize(sql, pageSize, showPage);//获取要显示的数据集合Vector vData=pages.getPage();%><html><head><base href="<%=basePath%>"><title>分页显示</title><meta http-equiv="pragma"content="no-cache"><meta http-equiv="cache-control"content="no-cache"><meta http-equiv="expires"content="0"><meta http-equiv="keywords"content="keyword1,keyword2,keyword3"> <meta http-equiv="description"content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body bgcolor="#FFFFFF"text="#000000"><h1align=center>留言簿</h1><div align=center><table border="1"cellspacing="0"cellpadding="0"width="80%"> <tr><th width="20%">编号</th><th width="20%">留言标题</th><th width="30">留言时间</th></tr><%for(int i=0; i<vData.size(); i++){//显示数据String[] sData=(String[])vData.get(i);%><tr><td><%=sData[0]%></td><td align=left><%=sData[1] %></td><td align=left><%//显示留言时间String wtime=sData[3];if(wtime.indexOf(".")>-1){wtime=wtime.substring(0,wtime.indexOf("."));}out.println(wtime);%></td></tr><%}%></table><form action="words.jsp"method="get"target="_self">共<fort color=red><%=pages.getRowCount() %></fort>条<%=pageSize %>条/页第<font color=red><%=showPage %></font>页/共<font color=red><%=pages.getPageCount() %></font>页<a href="words.jsp?showPage=1"target="_self">[首页]</a><%//判断“上一页”连接是否显示if(showPage>1){%><a href="words.jsp?showPage=<%=showPage-1 %>"target="_self">[上一页]</a><%}else{%>[上一页]<%}//判断“下一页”连接是否显示if(showPage<pages.getPageCount()){%><a href="words.jsp?showPage=<%=showPage+1 %>"target="_self" >[下一页]</a><%}else{%>[下一页]<%}%><a href="words.jsp?showPage=<%=pages.getPageCount() %>"tar get="_self">[尾页]</a>转到<select name="showPage"><%for(int x=1; x<=pages.getPageCount(); x++){%><option value="<%=x %>"<%if(showPage==x) out.println("sel ected"); %>><%=x %></option><%}%></select>页<input type="submit"name="go"value="提交"/></form><%//关闭数据库连接conn.close();%></div></body></html>效果:。

JSP文件上传说明

JSP文件上传说明

要实现文件上载,我们必须先了解上载文件的HTTP请求。

下面这个简单的应用示范了如何上载文件以及把HTTP请求的原始数据写入文件。

用文本编辑器查看该文件即可了解请求的格式,在此基础上我们就可以提取出上载文件的名字、文件内容以及原本混合在一起的其他信息。

在这里我们写一个简单的html页面up.html,提供一个表单,用户从这里选择文件并把文件上载到服务器。

<html><head><title>文件上载</title></head><body><form action="upjsp.jsp" enctype="MULTIPART/FORM-DA TA" method=post><br />公司: <input type="text" name="company" /><br />选择要上载的文件 <input type="file" name="filename" /><br /><input type="submit" value="上载" /></form></body></html>注意,<form>标记有一个enctype属性,属性值是"MULTIPART/FORM-DA TA"。

还有个type为file的输入框是用来选择上传文件的。

表单的action属性值是upjsp.jsp,这是将请求发送给upjsp.jsp文件。

upjsp.jsp调用了名为UpBean的JavaBean。

程序如下:<jsp:useBean id="TheBean" scope="page" class="UpBean " /><%TheBean.doUpload(request);%>下面是UpBean的实现代码:import java.io.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.ServletInputStream;public class UpBean {public void doUpload(HttpServletRequest request) throws IOException {PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("test.txt"))); ServletInputStream in = request.getInputStream();int i = in.read();while (i != -1) {pw.print((char) i);i = in.read();}pw.close();}}这个JavaBean把HttpServletRequest对象的表单原始数据写入test.txt文件.选择上传一个文本或者网页文件。

上传功能以二进制来判断文件后缀java

上传功能以二进制来判断文件后缀java

上传功能以二进制来判断文件后缀java在许多应用场景中,我们需要实现文件上传功能。

为了保证数据的正确性和便捷性,通常需要对上传的文件后缀进行判断,以便确保用户上传的文件符合预期格式。

本文将介绍如何利用Java实现文件上传功能,并通过二进制方式判断文件后缀。

1.了解上传功能的需求在开始编写代码之前,我们需要明确文件上传功能的需求。

例如,我们需要支持哪些文件类型、文件大小限制、并发上传等。

了解这些需求后,我们可以更好地设计上传功能。

2.掌握二进制判断文件后缀的方法要判断文件后缀,我们可以通过分析文件的二进制数据来实现。

通常情况下,文件后缀是由一个固定的字节序列表示的。

例如,文本文件的扩展名(如.txt)由ASCII码表示,图片文件的扩展名(如.jpg)则包含特定的标记字节。

通过识别这些字节序列,我们可以准确地判断文件后缀。

3.应用Java实现上传功能和文件后缀判断以下是使用Java实现文件上传功能和文件后缀判断的示例代码:```javaimport java.io.File;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.util.Arrays;public class FileUpload {public static void main(String[] args) {String filePath = "path/to/your/file";String uploadPath = "path/to/upload/folder";try {uploadFile(filePath, uploadPath);} catch (IOException e) {e.printStackTrace();}}public static void uploadFile(String filePath, String uploadPath) throws IOException {File file = new File(filePath);Path uploadPathObj = Paths.get(uploadPath);if (!Files.exists(uploadPathObj)) {Files.createDirectories(uploadPathObj);}String fileName = file.getName();String fileExtension = getFileExtension(fileName);Path targetPath = uploadPathObj.resolve(fileName);Files.copy(file.toPath(), targetPath, StandardCopyOption.REPLACE_EXISTING);System.out.println("File uploaded successfully!");}public static String getFileExtension(String fileName) {int dotIndex = stIndexOf(".");if (dotIndex > 0 && dotIndex < fileName.length() - 1) {return fileName.substring(dotIndex + 1);}return "";}}```上述代码首先定义了上传文件的方法`uploadFile`,它接收文件路径和上传路径作为参数。

JSP使用输入流和输出流实现文件上传示例

JSP使用输入流和输出流实现文件上传示例

JSP使用输入流和输出流实现文件上传示例JSP文件上传示例代码如下:```jsp<!DOCTYPE html><html><head><title>文件上传示例</title></head><body><h1>文件上传示例</h1><%//处理文件上传请求if (request.getMethod(.equalsIgnoreCase("POST"))//设置保存上传文件的目录String uploadDir = "D:/uploads";File dir = new File(uploadDir);if (!dir.exists()dir.mkdir(;}//获取请求中的所有文件Collection<Part> parts = request.getParts(;//遍历所有文件for (Part part : parts)//获取文件名String fileName = extractFileName(part);//将文件保存到服务器的目录中part.write(uploadDir + File.separator + fileName);//显示文件名out.println("上传的文件名:" + fileName + "<br>");}}// 从 Part 获取文件名的方法private String extractFileName(Part part)String contentDisp = part.getHeader("content-disposition"); String[] items = contentDisp.split(";");for (String s : items)if (s.trim(.startsWith("filename"))return s.substring(s.indexOf("=") + 2, s.length(-1);}}return "";}%><!--文件上传表单--><form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file1" /><br><input type="file" name="file2" /><br><input type="submit" value="上传" /></form></body></html>```上述示例中的代码实现了文件上传的功能。

JSP文件上传-二进制流详解

JSP文件上传-二进制流详解

JSP文件上传一、先做选择上传文件页面chose.jsp,比较简单。

代码如下:关键代码是:<form name="Myform" action="upfile.jsp" method="post" enctype="multipart/form-data">选择文件后的上传由upfile.jsp网页来处理;整个表单内容以post方式传递;表单中包含的所有内容,包括文件都会以enctype="multipart/form-data"二进制形式传给服务器。

注意JSP网页里不同的编码形式声明:charset=gb2312表示网页中包含的内容(比如文件)以简体中文编码;pageEncoding="UTF-8"表示JSP网页源代码本身是UTF-8编码。

因为表单form的内容会以二进制形式传到服务器,就必须用charset=gb2312指定这个二进制是以中文简体来编码的,这样传上去以后真正处理上传和存储的upfile.jsp页才能看懂识别中文文件名!选择文件页面比较简单,关键是编码的申明,必须说清楚,不然到时候中文文件名就会乱码。

二、upfile.jsp页用来接收和处理以二进制形式传给服务器的数据流。

1、二进制数据流的基本信息。

还是用request对象帮我们取从客户端传过来的各种信息,先取二进制数据流的整体长度,就是传过来文件的大小了,单位是字节。

int formDataLength = request.getContentLength();我们可以设置能接收的最大文件大小,比如下面,就是10M。

int MAX_SIZE = 10*1024*1024;再取传过来的二进制数据流类型,不知道里面是什么鬼?String contentType = request.getContentType();不要紧,我们打出来看看就知道了,out.print编程时非常有用,随时打出来瞅瞅。

jsp的文件上传

jsp的文件上传

lushengdi手把手教Jsp上传文件(FileUpload+Servlet)转载于/read.php?tid=7130本教程以Apache组织的commons项目中的FileUpload项目做为jsp的文件上传组件,FileUpload项目完全尊守RFC1867规范中关于在HTTP request 中通过Post方法提交文件的规范,该项目性能稳定快速,易于部署和使用.本次教程以前端jsp + 后端servlet的方式上传文件,你也可以完全在jsp中实现而不用servlet. 在开始之前你要准备以下几个东西:1. commons-FileUpload 1.2 包下载地址:/commons/fileupload/2. commons-IO 1.3.1 包下载地址:/commons/io/3. Commons-BeanUtils 1.7 包下载地址:/commons/beanutils/有了上面这些东西我们就可以开始了====================================================================== =========1. 新建一个叫upload的WEB项目(我用的是Lomboz3.2开发环境)2. 把上面下载下来的包分别解压并拷贝*.jar的文件到上面那个项目的WEB-INF/lib目录中3.接下来我们要准备一份如下内容的upload.jsp文件,用来选择要上传的文件,<html><head><title>Jsp+Servlet upload file</title></head><body><form name="upform" action="UploadServlet" method="POST" enctype="multipart/form-data"><input type ="file" name="file1" id="file1"/><br/><input type ="file" name="file2" if="file2"/><br/><input type ="file" name="file3" id="file3"/><br/><input type="submit" value="Submit" /><br/><input type="reset" /></form></body></html>上面文件中有几个需要注意的地方就是1. action="UploadServlet" 必须和后面的web.xml配置文件中对servlet映射必须保持一致.2. method="POST" 这里必须为"POST"方式提交不能是"GET".3. enctype="multipart/form-data" 这里是要提交的内容格式,表示你要提交的是数据流,而不是普通的表单文本.4. file1,file2,file3表示你要3个文件一起上传,你也可以一次只上传一个文件.====================================================================== =============接下来我们要写一个与上面这个upload.jsp配套的servlet程序,就叫做UploadServlet.java吧以下是该servlet的详细代码:看上去有点长,不过并不复杂,很容易明白的.import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import mons.fileupload.DefaultFileItemFactory;import mons.fileupload.FileItemFactory;import mons.fileupload.FileItemIterator;import mons.fileupload.FileItemStream;import mons.fileupload.disk.DiskFileItemFactory;import mons.fileupload.servlet.ServletFileUpload;import mons.fileupload.util.Streams;/*** Servlet implementation class for Servlet: UploadServlet**/public class UploadServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {File tmpDir = null;//初始化上传文件的临时存放目录File saveDir = null;//初始化上传文件后的保存目录public UploadServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {try{if(ServletFileUpload.isMultipartContent(request)){DiskFileItemFactory dff = new DiskFileItemFactory();//创建该对象dff.setRepository(tmpDir);//指定上传文件的临时目录dff.setSizeThreshold(1024000);//指定在内存中缓存数据大小,单位为byteServletFileUpload sfu = new ServletFileUpload(dff);//创建该对象sfu.setFileSizeMax(5000000);//指定单个上传文件的最大尺寸sfu.setSizeMax(10000000);//指定一次上传多个文件的总尺寸FileItemIterator fii = sfu.getItemIterator(request);//解析request 请求,并返回FileItemIterator集合while(fii.hasNext()){FileItemStream fis = fii.next();//从集合中获得一个文件流if(!fis.isFormField() && fis.getName().length()>0){//过滤掉表单中非文件域String fileName = fis.getName().substring(fis.getName().lastIndexOf(""""));//获得上传文件的文件名BufferedInputStream in = new BufferedInputStream(fis.openStream());//获得文件输入流BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(saveDir+fileName)));//获得文件输出流Streams.copy(in, out, true);//开始把文件写到你指定的上传文件夹}}response.getWriter().println("File upload successfully!!!");//终于成功了,还不到你的上传文件中看看,你要的东西都到齐了吗}}catch(Exception e){e.printStackTrace();}}public void init() throws ServletException {/* 对上传文件夹和临时文件夹进行初始化**/super.init();String tmpPath = "c:""tmpdir";String savePath = "c:""updir";tmpDir = new File(tmpPath);saveDir = new File(savePath);if(!tmpDir.isDirectory())tmpDir.mkdir();if(!saveDir.isDirectory())saveDir.mkdir();}}====================================================================== ==================================upload.jsp文件有了,配套的servlet也有了,现在最后剩下的就是怎么让它们配合工作了,接着我们把WEB-INF/web.xml文件请出来,并在该文件中加入以下内容:<servlet><servlet-name>UploadServlet</servlet-name><servlet-class>UploadServlet</servlet-class></servlet><servlet-mapping><servlet-name>UploadServlet</servlet-name><url-pattern>/UploadServlet</url-pattern></servlet-mapping>写好以后再点击"保存"====================================================================== ====================================把你的upload项目整个拷贝到tomcat的webapps目录下,启动tomcat.打开IE浏览器在地址栏中输入链接怎么样看到上传文件的输入框了吗? 什么,没有看到,出错了! 你仔细检查一下步骤有没有对. 好了,现在我们点击页面上的"浏览"按钮,找到我们要上传的文件,最后点击"Submit",太激动了,还不看一下你的c:"updir里面有没有你要的东西.。

Jsp文件上传

Jsp文件上传

JSP 文件上传JSP可以通过HTML的form表单上传文件到服务器。

文件类型可以是文本文件、二进制文件、图像文件等其他任何文档。

创建文件上传表单接下来我们使用HTML标签来创建文件上传表单,以下为要注意的点:∙form表单method属性必须设置为POST方法,不能使用GET 方法。

∙form表单enctype属性需要设置为multipart/form-data。

∙form表单action属性需要设置为提交到后台处理文件上传的jsp文件地址。

例如uploadFile.jsp程序文件用来处理上传的文件。

∙上传文件元素需要使用<input .../>标签,属性设置为type="file"。

如果需要上传多个文件,可以在<input .../>标签中设置不同的名称。

后台JSP处理脚本首先我们先定义文件上传后存储在服务上的位置,你可以将路径写在你的程序当中,或者我们可以在web.xml配置文件中通过设置context-param 元素来设置文件存储的目录,如下所示:<web-app>....<context-param><description>文件上传地址</description><param-name>file-upload</param-name><param-value>c:\apache-tomcat-5.5.29\webapps\data\</param-value></context-param>....</web-app>以下脚本文件UploadFile.jsp可以处理多个上传的文件,在使用该脚本前,我们需要注意以下几点:∙以下实例依赖FileUpload, 所以你需要在你的classpath中引入最新的commons-fileupload.x.x.jar包文件。

javascript 二进制代码

javascript 二进制代码

javascript 二进制代码一、什么是JavaScript二进制代码?JavaScript二进制代码是指将JavaScript源代码编译成机器可以执行的二进制代码,也称为字节码。

这种编译方式被称为即时编译(Just-In-Time Compilation,JIT),可以在运行时将源代码转换为机器码,从而提高程序的执行效率。

二、JavaScript二进制代码的优点1. 提高运行速度:由于二进制代码已经被编译成机器码,因此在运行时不需要再进行解释和编译,可以直接执行,大大提高了程序的运行速度。

2. 减少网络传输量:由于二进制代码相对于源代码来说更加紧凑,因此在网络传输时占用的带宽更小,可以减少网络传输量。

3. 保护源代码:由于JavaScript二进制代码已经被编译成机器码,因此无法通过反编译等方式获取源代码,可以保护源代码的安全性。

三、如何生成JavaScript二进制代码?1. 使用浏览器内置的JIT编译器:现代浏览器都内置了JIT编译器,在用户访问网页时会自动将JavaScript源码编译成机器码,并执行生成的二进制代码。

2. 使用第三方工具:除了浏览器内置的JIT编译器外,也有一些第三方工具可以将JavaScript源码编译成二进制代码,例如Google的Closure Compiler和Mozilla的SpiderMonkey等。

四、JavaScript二进制代码的缺点1. 可移植性差:由于不同平台的机器码不同,因此生成的JavaScript 二进制代码在不同平台上可能无法运行。

2. 调试困难:由于JavaScript二进制代码已经被编译成机器码,因此无法直接进行调试,需要使用特殊工具进行反汇编和分析。

五、如何优化JavaScript二进制代码?1. 减少全局变量的使用:全局变量会增加作用域链的长度,从而降低程序的执行效率。

可以使用局部变量或者命名空间等方式来减少全局变量的使用。

2. 避免重复计算:重复计算会浪费计算资源,可以使用缓存等方式来避免重复计算。

也谈一下JSP文件上传

也谈一下JSP文件上传

也谈一下JSP文件上传在这里看到很多讨论文件上传的文章,觉得各有利敝,有些只限于上传文件,而不能同时取得文本字段值,尤其是上传多个文件比较少,现本人做这个上传文件的类最多可支持上传255个文件,同时可取得文本字段值,请各位高手指正.文件上传类:MoqUploadBean.javapackage net.jspcn.tool;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;/**** Title: 文件上传类* Description: 既能对文件进行上传,又能取得输入框的值,最多可同时上传255个文件* Copyright: Copyright (c) 2002* Company: Tekson* @author 莫琼* @version 1.0*/public class UploadBean {private String[] sourceFile = new String[255]; //源文件名private String[] suffix = new String[255]; //文件后缀名private String canSuffix = ".gif.jpg.jpeg.png"; //可上传的文件后缀名 private String objectPath = "c:/"; //目标文件目录private String[] objectFileName = new String[255]; //目标文件名private ServletInputStream sis = null; //输入流private String[] description = new String[255]; //描述状态private long size = 100 * 1024; //限制大小private int count = 0; //已传输文件数目private byte[] b = new byte[4096]; //字节流存放数组 private boolean successful = true;private Hashtable fields = new Hashtable();public UploadBean() {}//设置上传文件的后缀名public void setSuffix(String canSuffix) {this.canSuffix = canSuffix;}//设置文件保存路径public void setObjectPath(String objectPath) { this.objectPath = objectPath;}//设置文件保存路径public void setSize(long maxSize) {this.size = maxSize;}//文件上传处理程序public void setSourceFile(HttpServletRequest request) throws IOException { sis = request.getInputStream();int a = 0;int k = 0;String s = "";while ( (a = sis.readLine(b, 0, b.length)) != -1) {s = new String(b, 0, a);if ( (k = s.indexOf("filename="")) != -1) {// 取得文件数据s = s.substring(k + 10);k = s.indexOf(""");s = s.substring(0, k);sourceFile[count] = s;k = stIndexOf(".");suffix[count] = s.substring(k + 1);if (canTransfer(count)) {transferFile(count);}++count;} else if ( (k = s.indexOf("name="")) != -1) {// 普通表单输入元素,获取输入元素名字String fieldName = s.substring(k+6, s.length()-3);sis.readLine(b, 0, b.length);StringBuffer fieldValue = new StringBuffer(b.length);while ( (a = sis.readLine(b, 0, b.length)) != -1) {s = new String(b, 0, a-2);if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) {break;} else {fieldValue.append(s);}}fields.put(fieldName, fieldValue.toString());}if (!successful)break;}}//取得表单元素值public String getFieldValue(String fieldName) { if (fields == null || fieldName == null) {return null;}return (String) fields.get(fieldName); }//取得上传文件数public int getCount() {return count;}//取得目标路径public String getObjectPath() {return objectPath;}//取得源文件名public String[] getSourceFile() {return sourceFile;}//取得目标文件名public String[] getObjectFileName() { return objectFileName;}//取得上传状态描述public String[] getDescription() {return description;}//判断上传文件的类型private boolean canTransfer(int i) {suffix[i] = suffix[i].toLowerCase();//这个是用来传图片的,各位可以把后缀名改掉或者不要这个条件if (sourceFile[i].equals("") || (!(canSuffix.indexOf("."+suffix[i])>=0))) { description[i] = "ERR: File suffix is wrong.";return false;}else {return true;}//上传文件转换private void transferFile(int i) {String x = Long.toString(new java.util.Date().getTime());try {objectFileName[i] = x + "." + suffix[i];FileOutputStream out = new FileOutputStream(objectPath + objectFileNam e[i]);int a = 0;int k = 0;long hastransfered = 0; //标示已经传输的字节数String s = "";while ( (a = sis.readLine(b, 0, b.length)) != -1) {s = new String(b, 0, a);if ( (k = s.indexOf("Content-Type:")) != -1) {break;}}sis.readLine(b, 0, b.length);while ( (a = sis.readLine(b, 0, b.length)) != -1) {s = new String(b, 0, a);if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) & & (b[4] == 45)) {break;}out.write(b, 0, a);hastransfered += a;if (hastransfered >= size) {description[count] = "ERR: The file " + sourceFile[count] + " is too large to transfer. The whole process is interrupted.";successful = false;break;}}if (successful) {description[count] = "Right: The file " + sourceFile[count] + " has been transfered successfully.";}out.close();if (!successful) {sis.close();File tmp = new File(objectPath + objectFileName[count]);tmp.delete();}}catch (IOException ioe) {description[i] = ioe.toString();}}public static void main(String[] args) {System.out.println("Test OK");}}文件上传调用:MoqUpload.jsp〈%@ page contentType="text/html; charset=GB2312" %> 〈html>〈head>〈title>文件上载〈/title>〈/head>〈body>〈form action="MoqUploadSubmit.jsp" enctype="MULTIPART/FORM-DATA" me thod="post">作者姓名:〈input type="text" name="Author" />〈br />公司名称:〈input type="text" name="Company" />〈br />文件描述:〈input type="text" name="Comment" />〈br />选择文件1:〈input type="file" name="filename1" /> 〈br />选择文件2:〈input type="file" name="filename2" /> 〈br />选择文件3:〈input type="file" name="filename3" /> 〈br />选择文件4:〈input type="file" name="filename4" /> 〈br />〈input type="submit" value="上载" />〈/form>〈/body>〈/html>文件上传提交:MoqUploadSubmit.jsp〈%@ page contentType="text/html;charset=gb2312"%>〈jsp:useBean id="fileBean" scope="page" class="net.moq.www.MoqUploadBea n" />〈%fileBean.setObjectPath("D:Temp");fileBean.setSize(10000*1024);fileBean.setSuffix(".gif.jpg.png.jpge.html.htm");fileBean.setSourceFile(request);String [] saSourceFile = fileBean.getSourceFile();String [] saObjectFile = fileBean.getObjectFileName(); String [] saDescription = fileBean.getDescription(); int iCount = fileBean.getCount();String sObjectPath = fileBean.getObjectPath();for(int i=0;i〈iCount;i++) {out.println("〈br>源始文件:");out.println(saSourceFile[i]);out.println("〈br>目标文件:");out.println(sObjectPath+saObjectFile[i]);out.println("〈br>上传说明:");out.println(saDescription[i]);out.println("〈br>");}out.println("〈br>作者:" + fileBean.getFieldValue("Author")); out.println("〈br>公司:" + fileBean.getFieldValue("Company")); out.println("〈br>说明:" + fileBean.getFieldValue("Comment")); %>。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JSP文件上传一、先做选择上传文件页面chose.jsp,比较简单。

代码如下:关键代码是:<form name="Myform" action="upfile.jsp" method="post" enctype="multipart/form-data">选择文件后的上传由upfile.jsp网页来处理;整个表单内容以post方式传递;表单中包含的所有内容,包括文件都会以enctype="multipart/form-data"二进制形式传给服务器。

注意JSP网页里不同的编码形式声明:charset=gb2312表示网页中包含的内容(比如文件)以简体中文编码;pageEncoding="UTF-8"表示JSP网页源代码本身是UTF-8编码。

因为表单form的内容会以二进制形式传到服务器,就必须用charset=gb2312指定这个二进制是以中文简体来编码的,这样传上去以后真正处理上传和存储的upfile.jsp页才能看懂识别中文文件名!选择文件页面比较简单,关键是编码的申明,必须说清楚,不然到时候中文文件名就会乱码。

二、upfile.jsp页用来接收和处理以二进制形式传给服务器的数据流。

1、二进制数据流的基本信息。

还是用request对象帮我们取从客户端传过来的各种信息,先取二进制数据流的整体长度,就是传过来文件的大小了,单位是字节。

int formDataLength = request.getContentLength();我们可以设置能接收的最大文件大小,比如下面,就是10M。

int MAX_SIZE = 10*1024*1024;再取传过来的二进制数据流类型,不知道里面是什么鬼?String contentType = request.getContentType();不要紧,我们打出来看看就知道了,out.print编程时非常有用,随时打出来瞅瞅。

out.print(contentType);会看到下面这个:主要就是要后面的这个东西一个表单form可能选了多个文件,全部在一个二进制数据流里面一起传过来,那么文件数据之间都用这个间隔boundary隔开的。

通过它才可以在二进制数据流中找到一个文件的开始和结束位置,从而将文件数据正确取出并保存到服务器里。

一个字节的位置错误都会造成文件保存出错!所以文件保存的最关键就是要找准位置,错一个字节都不行。

2、接收传过来的二进制数据流。

用InputStream对象来接收整个传过来的二进制数据:InputStream in=request.getInputStream();内存中新建二进制数组,跟整个传过来的二进制数据流一样大小:byte dataBytes[] = new byte[formDataLength];将上传的全部二进制数据全部读到(保存到)dataBytes字节数组里:in.read(dataBytes,0,formDataLength);in.close();//记得关掉内存中的in对象,回收资源将上传上来的全部内容由dataBytes字节数组转换为可见的字符串:String file = new String(dataBytes);3、探析二进制数据流。

继续用我们很厉害的out.print来看看,转换为字符串后的二进制数据流里面到底是些什么东西。

out.print(file.substring(0,1000));取file字符串的前1000个字符,看看里面的基本结构就可以了。

非常重要的函数substring(begin,end),就是取begin到end之间的子字符串,begin和end分别是子串起、止位置的下标。

以间隔开始;接着就是文件的基本(包括文件名,类型等);最后看不懂的就是上传文件的二进制内容。

文件内容也将会以间隔结束。

因为不同文件编码很复杂,这里我们直接页面展示肯定是乱码(只有txt文本文件才是直接utf-8,gb2312这样编码,其他文件都会自己另外重编,所以用网页直接打开都会是这样的乱码。

)知道间隔是什么样的,知道文件名在哪里,也知道哪些是文件内容。

就可以对二进制数据流进行正确截取,实现文件上传和存储了。

4、在二进制数据流中取出文件名、扩展名、间隔字符串。

int fNbg = file.indexOf("filename=\"")+10;找到在file字符串的起始位置!indexof函数就是找子字符串在大字符串中的其实位置的。

\是转义字符,\”表示引号,+10是要找到”的位置。

从f到”刚好10个字符。

int fNEd = file.indexOf("Content-Type:")-3;,反引号”在前面3个位置。

文件名的起始位置,结束位置都找到了,就可以取出来了。

String fileName= file.substring(fNbg,fNEd);Substring函数就是截取file字符串指定起、止位置的子字符串。

out.print(fileName);打出来看看,文件名对不对。

继续,取出间隔boundary。

int budyBg = file.indexOf("-");int budyEd = file.indexOf("\n")-1;String boundary = file.substring(budyBg,budyEd);在file文件中最开始就是boundary,结束标记是回车换行\n。

这就是文件数据流前后的间隔,开始是这个,结束也是这个。

同样,可以取出文件的扩展名:int extBg = fileName.indexOf(".")+1;int extEd = fileName.length();String extName = fileName.substring(extBg,extEd);out.print(extName);5、在二进制数据流中取出真正的文件内容。

每个文件的二进制数据流前后都是间隔boundary,但是数据流最开始部分是文件信息,不能直接存到文件里,真正的文件内容开始是在后面还要三句话(三个回车换行\n)之后。

int pos;从开始找文件内容起始位置:pos = file.indexOf("filename=\"");往后的第一个回车换行\n:pos = file.indexOf("\n",pos) + 1;往后的第二个回车换行\n:pos = file.indexOf("\n",pos) + 1;往后的第三个回车换行\n:pos = file.indexOf("\n",pos) + 1;找到了文件内容的起始位置,就是这里,它前面有联系两个\n。

文件内容的结束位置,当然就是后面一个间隔的开始位置:int boundaryLocation = file.indexOf(boundary,pos) - 4;注意,这些位置坐标都是在file字符串的绝对位置,从0开始。

每次都从前一次的pos开始再往后找。

文件内容的真正开始位置,要转成二进制字节计数:int startPos = ((file.substring(0,pos)).getBytes()).length;文件内容的真正结束位置,要转成二进制字节计数:int endPos = ((file.substring(0,boundaryLocation)).getBytes()).length;先确定服务器上的路径和文件名:String jspcurpath=application.getRealPath(request.getRequestURI()); String curdir=new File(jspcurpath).getParent();String path=curdir + "\\upfile";File d=new File(path);if(!(d.exists())){//如果指定目录不存在d.mkdir();//则建立upfile目录}String savefileName = path + "\\"+ fileName;File checkFile = new File(savefileName);if(checkFile.exists()){checkFile.delete();}再利用FileOutputStream对象开始截取二进制数据,写入指定文件。

FileOutputStream fileOut = new FileOutputStream(savefileName);fileOut.write(dataBytes,startPos,(endPos - startPos));最后,记得关掉FileOutputStream对象。

fileOut.close();文件上传的关键就在于二进制数据流中各种内容起、止位置的确定,一定要好好体会。

字节数组转换为字符串再定位截取内容,会产生一些问题,并不精确,所以最好就是直接在二进制字节数组里面定位截取。

不用上面的方法,我们另做一个upfile.jsp文件。

自己写一个函数,在字节数组中定位一个子串的位置下标。

<%!//该函数功能为:从下标offset位置开始,在字节数组Src中找到第一个Des子串的起始位置,返回其在Src数组中的下标public static int ByteIndexOf(byte Src[],byteDes[],int offset){int i=offset; //Src数组从下标offset开始对比int j=0; //Des数组从下标0开始对比int subBg = -1; //-1表示尚没有找到子串int DesLength = Des.length;//Src数组的长度int SrcLength = Src.length;//Des数组的长度while(j<DesLength && i<SrcLength) //i在Src数组中没有找完,j在Des数组中也没有找完{if(Src[i]==Des[j]){ //如果两个数组的当前字节一样i++;j++; //i在Src数组中往后走一个,j在Des数组中往后走一个,返回循环继续对比}else{ //如果两个数组的当前字节不一样if(j>0) //如果Des数组的当前下标j大于零,表示Src数组已经找到与Des数组前几个字节相同的子串,但是没有全部匹配,要重新开始j=0; //则j回到Des数组的第0个字节;而i继续停在Src数组当前位置,返回循环与Des数组的第0个字节重新开始比else{ //如果Des数组的当前下标j仍是0,表示Src数组一直没有找到与Des数组匹配的第一个字节i++; //则i继续在Src数组中往后走,返回循环继续与Des数组的第0个字节比对j=0; //确保Des数组当前下标j回到0}}}if(j==DesLength && i<SrcLength) //循环结束,如果j 下标达到Des数组长度,表示找到了子串了subBg=i-DesLength; //子串在Src数组中的其实位置下标就是当前位置i减去DesLengthelse //循环结束,如果j下标没有达到Des数组长度,表示未找到子串subBg=-1; //值为-1,表示未找到指定子串return(subBg); //返回子串的其实位置,如果是-1则表示没有指定的子串}%>函数写好后,主程序如下:<%int MAX_SIZE = 10*1024*1024;int formDataLength = request.getContentLength();try{if(formDataLength<=MAX_SIZE){if(formDataLength>200){InputStream in=request.getInputStream();//将上传的数据流全部保存在byte数组中byte dataBytes[] = new byte[formDataLength];int byteRead = 0;int totalBytesRead = 0;//以1024字节为单位,循环读出InputStream数据流,存到dataBytes[]字节数组里while(totalBytesRead < formDataLength){byteRead =in.read(dataBytes,totalBytesRead,1024);totalBytesRead += byteRead;}in.close();//读出来后,就关掉InputStream数据流对象in//在二进制字节数组里面直接定位各种信息内容的位置,以及截取byte FenGe[] ={13,10}; //这个字节数组放的就是回车换行,13是回车字符的AscII码,10是换行字符的AscII码int Budbg = 0; //数据流一开始就是间隔,间隔开始位置就是下标0int BudEd = ByteIndexOf(dataBytes,FenGe,0); //间隔的结束是一个回车换行,结束位置用函数ByteIndexOf获取int Budlg = BudEd - Budbg; //间隔的长度byte Budery[]=new byte[Budlg];//间隔字节数组,用来放间隔的字节二进制数据System.arraycopy(dataBytes,0,Budery,0,Budlg);//用arraycopy从dataBytes的0位置开始中截取出长度为Budlg的间隔出来//放到Budery从0开始的位置,字节数组Budery现在就放的是文件间隔字符串了String flbg = "filename=\""; //文件名的开始标记byte FNbgB[] = flbg.getBytes(); //文件名的开始标记转换为二进制字节数组int fnameBg = ByteIndexOf(dataBytes,FNbgB,0)+10;//用函数ByteIndexOf帮助定位文件名开始位置下标byte FNedB[] = {13,10}; //文件名的结束标记也是回车换行int fnameEd =ByteIndexOf(dataBytes,FNedB,fnameBg)-1; //用函数ByteIndexOf帮助定位文件名结束位置下标,-1是因为末尾还有一个双引号int FnLen = fnameEd - fnameBg;byte File_Name[] = new byte[FnLen];//将文件名放入这个字节数组System.arraycopy(dataBytes,fnameBg,File_Name,0,FnLen) ;//用arraycopy从dataBytes中截取出文件名String filename = new String(File_Name); //文件名是字符串,将字节数组转为字符串,得到真正文件名byte FileFenGe[] ={13,10,13,10};//文件头信息是以连续两个回车换行结束的int Filebg =ByteIndexOf(dataBytes,FileFenGe,BudEd+2)+4; //用函数ByteIndexOf继续往后获取这连续两个回车换行的位置//真正的文件内容在这连续两个回车换行之后//文件流内容的结束是以间隔字节数组Budery为标记的int FileEd =ByteIndexOf(dataBytes,Budery,Filebg)-2;//用函数ByteIndexOf继续往后获取文件结束间隔的位置,-2是因为前面又有一个回车换行int Filelen = FileEd - Filebg; //真正文件内容的长度Stringjspcurpath=application.getRealPath(request.getRequest URI());String curdir=new File(jspcurpath).getParent();String path=curdir + "\\upfile";File d=new File(path);if(!(d.exists())){//如果指定目录不存在d.mkdir();//则建立upfile目录}String savefileName = path + "\\"+ filename;//out.print(fileName);File checkFile = new File(savefileName);if(checkFile.exists()){checkFile.delete();}FileOutputStream fileOut = newFileOutputStream(savefileName);fileOut.write(dataBytes,Filebg,Filelen);fileOut.close();out.print("文件上传成功!");}else{out.print("文件不存在,无法上传!");}}else{out.print("文件超过10M限额,无法上传!"); }}catch(IOException e){out.print("upload error.");e.printStackTrace();}%>需要源代码的请百度华夏电商,来专业博客下载。

相关文档
最新文档