当前位置: 代码迷 >> Java Web开发 >> 高分,applet和servlet通信——断点上传
  详细解决方案

高分,applet和servlet通信——断点上传

热度:205   发布时间:2016-04-17 01:14:54.0
高分求助,applet和servlet通信——断点上传
我想通过applet和servlet通信的方式,做一个断点上传的demo。我的做法是,在applet上传文件之前,先发送一个请求去判断待上传文件是否在服务器端已存在。如果存在,返回存在文件的字节数。如果该字节数比待上传文件小,客户端则跳过该字节数个字节上传剩余部分文件;否则,提示该文件已存在。
由于是基于http通信的,一次请求只能做一次读写,所以获取服务器端信息和上传文件是在两个请求里面。可是我服务器端的写法好像有问题,造成和客户端的通信出现问题。客户端请求后,服务器端返回了存在的文件的信息,但是好像并不响应第二次上传文件的请求,麻烦各路高手帮我看下。我已经试了一些方法,都没能解决问题。
具体的源代码如下:
客户端的applet程序:
UploadFile.java

Java code
 
package upload;

import java.applet.Applet;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/****************************************
* <p>Title:UploadFile </p> *
* <p>Description:上传文件的applet </p> *
* <p>@author jerry </p> *
* <p>version: 1.0 </p> *
****************************************/

public class UploadFile extends Applet {

private static final long serialVersionUID = 1L;

public UploadFile() throws Exception {

HttpURLConnection con = this.getConnection();
con.disconnect();

//处理本地需要上传的文件
String path = "D:\\temp\\tm.zip";
File file = new File(path);
long fileLength = file.length(); // 获取文件字节数
System.out.println("要上传的文件大小为:" + fileLength);

//上传文件到服务器
long startPos = this.getServletObject(con); //获取服务器的返回信息

//判断是否需要上传
if(startPos < fileLength) {
System.err.println("文件未传完,现在开始上传剩余部分");
this.sendServletObject(con, path, startPos);
} else {
System.err.println("该文件已存在!");
}
}

/****************************************
* <p>功能:上传文件到服务器 </p> *
* <p>@param con 与服务器的连接 </p> *
* <p>@param path 需要上传的文件的路径 </p> *
* <p>@throws IOException </p> *
****************************************/
private void sendServletObject(HttpURLConnection con, String path, long nstartPos)
throws Exception {

FileInputStream fis = null;
BufferedInputStream bis = null;
con = this.getConnection();

long startPos = nstartPos; //开始上传的位置
BufferedOutputStream bos = null;
byte[] buf = new byte[4096]; //定义一个4M的缓存区
int len = 0;
//int totalBytes = 0;

try {
bos = new BufferedOutputStream(con.getOutputStream());
fis = new FileInputStream(path);
bis = new BufferedInputStream(fis);
bis.skip(startPos);

while ((len = bis.read(buf)) != -1) {
bos.write(buf, 0, len); //上传文件
bos.flush(); //缓存刷新
}

} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null) {
bis.close();
}
if (fis != null) {
fis.close();
}
if (bos != null) {
bos.flush();
bos.close();
}
buf = null;
}
}

/********************************
* <p>功能:获取与服务器的连接 </p> *
* <p>@return </p> *
* <p>@throws Exception </p> *
********************************/
private HttpURLConnection getConnection() throws Exception{
String url = "http://localhost:8080/UploadTest/temp";
String data = "test.zip";
URL server = new URL(url + "?filename=" + data);
System.out.println("url= " + url + "?filename=" + data);

HttpURLConnection con = (HttpURLConnection) server.openConnection(); //获取服务器端连接
  相关解决方案