- 浏览: 111776 次
- 性别:
- 来自: 北京
最新评论
-
a535182324:
不错,学习了
如何区分JDK,Tomcat,eclipse的32位与64版本 -
lxh2002:
总结得很全面,辛苦了!
Spring 3.x jar 包详解 与 依赖关系 -
jxdezhu1:
很详细,正好在研究断点续传,谢谢
java断点续传的原理
文件的上传在本地来说就是把一个文件挪到另一个地方,对于网络来说只是目标地址是网络的地址而已。java实现的原理代码如下:
File source =new File("F:/music/一生爱你千百回.mp3");
//定义目标路径
File target =new File("D:/music",source.getName());
//开始上传
CopyFile(source,target);
//实现文件上传的核心代码
static void CopyFile (File source ,File target){
InputStream in=null;
OutputStream out=null;
in=new FileInputStream(source);
out=new FileOutputStream(target);
byte[] buf =new byte[1024*10];
int len=in.read(buf);
while(len!=-1){
out.write(buf,0,len);
len=in.read(buf);
}
}
============================================================================
下面就是手工写的一个servlet上传的一个例子:
1:控制层的代码:ServletActon.jsp
package com.test.action;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringReader;
import java.util.Hashtable;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletAction extends HttpServlet{
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
final int NONE=0;
final int DATAHEADER=1;
final int FILEDATA=2;
final int FIELDDATA=3;
//将请求消息的实体送到b变量中
int TotalBytes=request.getContentLength();
byte[] b=new byte[TotalBytes];
String contentType=request.getContentType();//请求消息类型
String fieldname=""; //表单域的名称
String fieldvalue=""; //表单域的值
String filename=""; //文件名
String boundary=""; //分界符
String lastboundary=""; //结束符
int filesize=0; //文件长度
Hashtable formfields=new Hashtable();
int pos=contentType.indexOf("boundary=");
String fileID; //上传的文件ID
if(pos!=-1) //取得分界符和结束符
{
pos+="boundary=".length();
boundary="--"+contentType.substring(pos);
lastboundary=boundary+"--";
}
int state=NONE;
//得到数据输入流reqbuf
DataInputStream in=new DataInputStream(request.getInputStream());
in.readFully(b);
in.close();
String reqContent=new String(b);
BufferedReader reqbuf=new BufferedReader(new StringReader(reqContent));
boolean flag=true;
int i=0;
while(flag==true)
{
String s=reqbuf.readLine();
if((s==lastboundary)||(s==null)) break;
switch(state)
{
case NONE:
if (s.startsWith(boundary))
{
state=DATAHEADER;
i+=1;
}
break;
case DATAHEADER:
pos=s.indexOf("filename=");
if (pos==-1)
{ //将表单域的名字解析出来
pos=s.indexOf("name=");
pos+="name=".length()+1;
s=s.substring(pos);
int l=s.length();
s=s.substring(0,l-1);
fieldname=s;
state=FIELDDATA;
}
else
{ //将文件名解析出来
String temp=s;
pos=s.indexOf("filename=");
pos+="filename=".length()+1;
s=s.substring(pos);
int l=s.length();
s=s.substring(0,l-1);
pos=s.lastIndexOf("\\");
s=s.substring(pos+1);
filename=s;
//从字节数组中取出文件数组
pos=byteIndexOf(b,temp,0);
b=subBytes(b,pos+temp.getBytes().length+2,b.length);//去掉前面的部分
s=reqbuf.readLine();
b=subBytes(b,s.getBytes().length+4,b.length);
pos=byteIndexOf(b,boundary,0);
b=subBytes(b,0,pos-1);
File f=new File(formfields.get("FilePath")+"\\"+filename); //写入文件
DataOutputStream fileout=new DataOutputStream(new FileOutputStream(f));
fileout.write(b,0,b.length-1);
filesize=b.length-1;
state=FILEDATA;
}
break;
case FIELDDATA:
s=reqbuf.readLine();
fieldvalue=s;
formfields.put(fieldname,fieldvalue);
state=NONE;
break;
case FILEDATA:
while((!s.startsWith(boundary))&&(!s.startsWith(lastboundary)))
{
s=reqbuf.readLine();
if (s.startsWith(boundary))
{
state=DATAHEADER;
break;
}
}
break;
}
}
//指定输出类型
response.setContentType("text/html;charset=gb2312");
PrintWriter out =response.getWriter();
out.println("<html>");
out.println("<head><title>文件上传结果</title></head>");
out.println("<body>");
out.println("<h1>文件上传结果</h1><hr>");
out.println("ID为"+formfields.get("FileID")+"的文件"+filename+"已经上传!"+
"文件长度为:"+filesize+"字节");
out.println("</body></html>");
out.close();
}
//Get Servlet information
public String getServletInfo() {
return "UploadServlet.UploadServlet Information";
}
//字节数组中的INDEXOF函数,与STRING类中的INDEXOF类似
private static int byteIndexOf(byte[] b,String s,int start)
{
return byteIndexOf(b,s.getBytes(),start);
}
//字节数组中的INDEXOF函数,与STRING类中的INDEXOF类似
private static int byteIndexOf(byte[] b,byte[] s,int start)
{
int i;
if(s.length==0)
{
return 0;
}
int max=b.length-s.length;
if(max<0)
return -1;
if(start>max)
return -1;
if (start<0)
start=0;
search:
for(i=start;i<=max;i++)
{
if (b[i]==s[0])
{
int k=1;
while(k<s.length)
{
if(b[k+i]!=s[k])
{
continue search;
}
k++;
}
return i;
}
}
return -1;
}
//用于从一个字节数组中提取一个字节数组
private static byte[] subBytes(byte[] b,int from,int end)
{
byte[] result=new byte[end-from];
System.arraycopy(b,from,result,0,end-from);
return result;
}
//用于从一个字节数组中提取一个字符串
private static String subBytesString(byte[] b,int from,int end)
{
return new String(subBytes(b,from,end));
}
}
2:客户端的代码 index.html
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>上传文件</title>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse"
bordercolor="#111111" width="100%" id="AutoNumber1">
<tr>
<td width="15%"> </td>
<td width="80%">
<table border="0" cellpadding="10" cellspacing="10" style="border-collapse: collapse"
bordercolor="#111111" width="100%" id="AutoNumber5">
<tr>
<td width="100%"><b><font face="黑体">全文辅助工具之一:上传文件接收</font></b></td>
</tr>
<tr>
<td width="100%">
<p align="right"><font color="#FF0000" size="2">作者:qixiaorui</font></td>
</tr>
</table>
</td>
<td width="5%"> </td>
</tr>
<tr>
<td width="15%"> </td>
<td width="80%">
<table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111"
width="100%" id="AutoNumber2">
<tr>
<td width="100%">
<form method="POST" enctype="multipart/form-data" action="http://localhost:8080/UpAndDownTest/upload">
<table border="0" cellpadding="10" cellspacing="10" style="border-collapse: collapse"
bordercolor="#111111" width="100%" id="AutoNumber3">
<tr>
<td width="100%" bgcolor="#00FFFF">
<p align="center"><font face="华文仿宋" color="#000080"><b>
--------------------------------- 上 传 文 件
----------------------------------</b></font></td>
</tr>
<tr>
<td width="100%">
<table border="0" cellpadding="3" cellspacing="3" style="border-collapse: collapse"
bordercolor="#111111" width="100%" id="AutoNumber4">
<tr>
<td width="27%">请输入服务器路径:</td>
<td width="73%"><input type="text" name="FilePath" size="52">
如: c:\aa</td>
</tr>
<tr>
<td width="27%">请输入操作ID:</td>
<td width="73%"><input type="text" name="FileID" size="52"></td>
</tr>
<tr>
<td width="27%">请输入文件路径:</td>
<td width="73%"><input type="file" name="FileData" size="41"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td width="100%">
<input type="submit" value="提交" name="uploadfile">
<input type="reset" value="重置" name="B2"></td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</td>
<td width="5%"> </td>
</tr>
<tr>
<td width="15%"> </td>
<td width="80%"> </td>
<td width="5%"> </td>
</tr>
</table>
</body>
</html>
3:配置端代码:web.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<web-app id="IDOLSearch">
<display-name>test</display-name>
<description>This is Idol Sever Default Web Application.</description>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.test.action.ServletAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/upload/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
=============================================================
对于web应用的一些下载可以用一些现成的插件,例如common-fileupload组件
下载地址:http://jakarta.apache.org/commons /fileupload/import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
public class Upload extends HttpServlet {
private String uploadPath = "C:\\upload\\"; // 用于存放上传文件的目录
private String tempPath = "C:\\upload\\tmp\\"; // 用于存放临时文件的目录
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
try {
DiskFileUpload fu = new DiskFileUpload();
// 设置最大文件尺寸,这里是4MB
fu.setSizeMax(4194304);
// 设置缓冲区大小,这里是4kb
fu.setSizeThreshold(4096);
// 设置临时目录:
fu.setRepositoryPath(tempPath);
// 得到所有的文件:
List fileItems = fu.parseRequest(request);
Iterator i = fileItems.iterator();
// 依次处理每一个文件:
while(i.hasNext()) {
FileItem fi = (FileItem)i.next();
// 获得文件名,这个文件名包括路径:
String fileName = fi.getName();
if(fileName!=null) {
// 在这里可以记录用户和文件信息
// ...
// 写入文件a.txt,你也可以从fileName中提取文件名:
fi.write(new File(uploadPath + "a.txt"));
}
}
// 跳转到上传成功提示页面
}
catch(Exception e) {
// 可以跳转出错页面
}
}
}
//当servlet收到浏览器发出的Post请求后,在doPost()方法中实现文件上传。以下是示例代码:
如果要在配置文件中读取指定的上传文件夹,可以在init()方法中执行:
public void init() throws ServletException {
uploadPath = ....
tempPath = ....
// 文件夹不存在就自动创建:
if(!new File(uploadPath).isDirectory())
new File(uploadPath).mkdirs();
if(!new File(tempPath).isDirectory())
new File(tempPath).mkdirs();
}
配置servlet,用记事本打开tomcat\webapps\你的webapp\WEB-INF\web.xml,没有的话新建一个。典型配置如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!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>
<servlet>
<servlet-name>Upload</servlet-name>
<servlet-class>Upload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload</servlet-name>
<url-pattern>/fileupload</url-pattern>
</servlet-mapping>
</web-app>
配置好servlet后,启动tomcat,写一个简单的html测试:
<form action="fileupload" method="post" enctype="multipart/form-data" name="form1">
<input type="file" name="file">
<input type="submit" name="Submit" value="upload">
</form>
注意action="fileupload"其中fileupload是配置servlet时指定的url-pattern。
================================================================
还有如:commons-fileupload-1.2.1.jar
try {
DiskFileItemFactory dfif=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(dfif);
upload.setSizeMax(10*1024*1024);
List list=upload.parseRequest(request);
for(int i=0;i<list.size();i++){
FileItem item=(FileItem) list.get(i);
String name=item.getName();
String path=this.getServletContext().getRealPath("/upload");
item.write(new File(path,name));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
相关推荐
纯java代码,演示上传文件,适合任何文件,主要是了解HTTP请求的信息,然后解析请求的字符串,此事例只考虑了现在的两种主要的浏览器的请求,因为浏览器不一样文件名会有差异,IE就只有文件名,而FF就是全路径名
Java 文件上传进度条实现的基本原理主要涉及到客户端与服务器之间的数据传输、多线程处理和用户界面更新。在本文中,我们将深入探讨这个过程,并提供一个简单的实现思路。 首先,了解文件上传的基本流程:用户选择...
Java文件异步上传是一种在Web应用中常见的技术,它允许用户在不阻塞浏览器界面的情况下上传文件。这种技术尤其在处理大文件或者批量上传时,能够显著提升用户体验,因为它们不会冻结页面,允许用户继续与应用程序...
2. **文件上传原理** 文件上传是通过HTTP协议的POST请求来实现的。在HTTP请求中,文件数据被编码为多部分/形式数据(multipart/form-data),每个部分都包含一个描述其内容类型的头部和文件内容。 3. **Struts中的...
【Java 上传下载文件工程详解】 在Web应用中,文件的上传和下载是常见的功能,尤其是在用户交互频繁的系统中。本项目“java 上传下载文件工程”利用了jspSmartUpload组件来实现这一功能,旨在提供一个简洁、易用的...
首先,SwfUpload控件在前端部分的工作原理是通过Flash插件实现的,因为Flash支持分块上传,这对于上传大文件非常有用。用户选择文件后,SwfUpload会将文件切割成小块,并逐个发送到服务器,这样可以避免一次性加载...
由于HTML5的兴起,现代浏览器提供了更好的API(如FileReader API和FormData API)来处理文件上传,但理解`swfupload`的工作原理对于了解文件上传的历史和基础概念仍然有价值。 1. **图片上传** - **异步上传**:`...
在Java编程语言中,上传文件是一项常见的任务,广泛应用于各种应用程序,如Web服务、云存储接口等。这里我们将深入探讨如何使用...通过理解这些工具的工作原理和使用方法,你可以构建稳定且功能强大的文件上传功能。
根据给定的信息,本文将详细解释Java上传文件的简单代码逻辑及其实现方式。通过解析提供的部分代码片段,我们可以了解到这段代码实现了一个简单的文件上传功能。下面将对这些知识点进行详细说明。 ### Java文件上传...
本篇文章将详细探讨Java实现大文件上传的原理、方法及优化策略。 首先,我们需要理解HTTP协议在上传大文件时面临的挑战。标准的HTTP POST请求会一次性发送整个文件内容,如果文件过大,可能会导致网络拥塞,超时...
在Java开发中,分片上传是一种处理大文件上传的有效策略,尤其在云存储服务和分布式系统中广泛应用。这种技术将一个大文件分割成多个小块(分片),然后逐个上传,确保上传过程的稳定性和可靠性。以下是关于Java分片...
**Java上传文件到Linux服务器** 在Java中,可以使用ganymed-ssh2库来实现在Linux服务器上上传文件。这个库提供了SSH2协议的实现,包括SFTP(Secure File Transfer Protocol)功能。首先,需要添加ganymed-ssh2的...
使用java通过HTTP协议上传文件 使用java通过HTTP协议上传文件 使用java通过HTTP协议上传文件 使用java通过HTTP协议上传文件 使用java通过HTTP协议上传文件 使用java通过HTTP协议上传文件
在这个场景中,我们主要关注如何使用SmartUpload进行文件上传,并通过一个Demo来理解其工作原理。 1. **SmartUpload介绍**: SmartUpload是一个开源的Java库,专门用于处理HTTP请求中的多部分/form-data数据,即...
首先,我们需要理解Java中的文件上传原理。HTTP协议本身并不支持文件上传,但可以通过POST请求的多部分数据(Multipart Form Data)来实现。在Java中,我们可以使用Servlet API中的`Part`接口和`HttpServletRequest`...
开发者不仅需要理解FTP协议的工作原理,还要熟练掌握Swing组件的使用,以及如何利用Java的I/O和网络API实现文件的上传和下载。这个项目的源代码对于学习Java FTP客户端开发和Swing GUI编程具有很高的参考价值。
以上代码展示了如何结合Java后端和HTML5前端实现拖拽上传的基本原理。在实际项目中,你可能还需要考虑文件大小限制、文件类型检查、进度显示、错误处理等细节。`uploadcaesar`可能是项目源代码的名称,里面应该包含...
综上所述,Java文件上传与下载涉及到了Web开发的基本原理和安全实践。通过学习和实践,初学者不仅可以掌握核心技能,还能了解到Web应用开发中的一些重要概念和注意事项。在实际项目中,结合合适的框架和库,可以更...
首先,我们要理解文件上传的基本原理。在HTTP协议中,文件上传通常是通过POST请求实现的。在Java Web应用中,我们通常使用Servlet或者Spring MVC框架来处理这些请求。用户选择要上传的文件后,浏览器会将文件内容...
在Java编程语言中,HTTPURLConnection是Java标准库提供...虽然这需要对HTTP协议有一定的理解,但它是理解网络编程和文件上传原理的一个好起点。在实际开发中,我们还需要考虑如安全性、错误处理和性能优化等更多因素。