利用HttpURLConnection上传文件
简单需求:将文件和文件名称都上传到服务器上
客户端:
package upload;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class UploadFile2 {
/**
* 获得与服务的连接
* @return
* @throws Exception
*/
public HttpURLConnection getConnection() throws Exception {
// 服务器的URL
URL url = new URL("http://localhost:8080/RvmService/InitServlet");
HttpURLConnection uc = (HttpURLConnection) url.openConnection();
// 上传图片的一些参数设置
uc.setRequestProperty(
"Accept",
"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-quickviewplus, */*");
uc.setRequestProperty("Accept-Language", "zh-cn");
uc.setRequestProperty("Content-type",
"multipart/form-data; boundary=---------------------------7d318fd100112");
uc.setRequestProperty("Accept-Encoding", "gzip, deflate");
uc.setRequestProperty("User-Agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
uc.setRequestProperty("Connection", "Keep-Alive");
uc.setDoOutput(true);
uc.setUseCaches(true);
return uc;
}
/**
* 上传文件
* @param f
* @return
* @throws Exception
*/
public String upload(File f) throws Exception {
HttpURLConnection uc = getConnection();
// 获取文件流
int size = (int) f.length();
byte[] data = new byte[size];
FileInputStream fis = new FileInputStream(f);
OutputStream out = uc.getOutputStream();
fis.read(data, 0, size);
// 写入文件名
out.write(f.getName().trim().getBytes());
// 写入分隔符
out.write('|');
// 写入图片流
out.write(data);
out.flush();
out.close();
fis.close();
// 读取响应数据
int code = uc.getResponseCode();
String sCurrentLine = "";
// 存放响应结果
String sTotalString = "";
if (code == 200) {
java.io.InputStream is = uc.getInputStream();
BufferedReader reader = new BufferedReader(
new InputStreamReader(is));
while ((sCurrentLine = reader.readLine()) != null)
if (sCurrentLine.length() > 0)
sTotalString = sTotalString + sCurrentLine.trim();
} else {
sTotalString = "远程服务器连接失败,错误代码:" + code;
}
return sTotalString;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
UploadFile2 upload = new UploadFile2();
File f = new File("D:\\RVMCENTER.jar");
try {
System.out.println(upload.upload(f));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务端:
package com.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class InitServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("aaa");
System.out.println("Context Length : " + request.getContentLength());
ServletInputStream inStream = request.getInputStream(); // 取HTTP请求流
int size = request.getContentLength(); // 取HTTP请求流长度
byte[] buffer = new byte[size]; // 用于缓存每次读取的数据
byte[] result = new byte[size]; // 用于存放结果的数组
int count = 0;
int rbyte = 0;
// 循环读取
while (count < size)
{
rbyte = inStream.read(buffer); // 每次实际读取长度存于rbyte中 sflj
for (int i = 0; i < rbyte; i++)
{
result[count + i] = buffer[i];
}
count += rbyte;
}
// 先找到文件名和图片流的标志位'|'
int index = 0;
for (int i = 0; i < result.length; i++)
{
byte b = result[i];
if (b == '|')
{
index = i;
break;
}
}
// 存放文件名
byte name[] = new byte[index + 1];
// 存放图片字节
byte[] img = new byte[size - index];
for (int i = 0; i < result.length; i++)
{
if (i < index)
{
name[i] = result[i];
}
if (i > index)
{
// 这时注意img数组的index要从0开始
img[i - index - 1] = result[i];
}
}
// 还原文件名
String fileName = new String(name);
inStream.close();
String newFileName = fileName;
// 响应客戶端
response.setContentType("text/html");
// 注意响应中文数据时要设置
response.setCharacterEncoding("GBK");
PrintWriter out = response.getWriter();
//可能情況 0 数据库无响应记录 1 文件名不符合要求 其它情況为正常
if(newFileName.equals("0"))
{
out.write("0|" + fileName);
}
else if(newFileName.equals("1"))
{
out.write("1|" + fileName);
}
else
{
out.write(fileName);
}
out.close();
//上传错误中止后续操作
if(newFileName.length()<= 1)
{
return;
}
ServletContext servlet = this.getServletContext();
File f = new File(servlet.getRealPath("/") + "/" + newFileName);
FileOutputStream fos = new FileOutputStream(f);
fos.write(img);
fos.flush();
fos.close();
System.out.println("aaaa" + servlet.getRealPath("/") + "/" + newFileName);
}
/**
* 接收文件
* @param req
* @throws ServletException
* @throws IOException
*/
public void receiveFile(HttpServletRequest req) throws ServletException, IOException {
ServletContext servlet = this.getServletContext();
InputStream in = req.getInputStream();
File f = new File(servlet.getRealPath("/") + "/dowload/aaaa.txt");
FileOutputStream fos = new FileOutputStream(f);
// ObjectInputStream ins = new ObjectInputStream(in);
byte[] b = new byte[1024 * 1024];
int totalBytes, bytes, sumBytes = 0;
totalBytes = req.getContentLength();
while (true) {
bytes = in.read(b);
if (bytes <= 0)
break;
sumBytes += bytes;
fos.write(b, 0, bytes);
System.out.println(sumBytes + " of " + totalBytes + " "
+ ((float) sumBytes / (float) totalBytes) * 100 + "% done");
}
fos.close();
in.close();
}
}