`
zhaoshengxuan108
  • 浏览: 25997 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用HttpURLConnection上传文件

    博客分类:
  • Java
阅读更多

利用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();
	}
	
}
分享到:
评论

相关推荐

    Java利用HttpURLConnection发送post请求上传文件.docx

    Java利用HttpURLConnection发送post请求上传文件

    利用HttpUrlConnection 上传 接收文件的实现方法

    下面小编就为大家带来一篇利用HttpUrlConnection 上传 接收文件的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Android与Internet接轨案例源代码

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全的目录

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google+Android+SDK开发范例大全

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全(完整版附部分源码).pdf

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller...

    Google Android sdk 开发范例大全 部分章节代码

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK 开发范例大全01

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK 开发范例大全02

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全(完整版)

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    用HttpClient来模拟浏览器GET POST

    再有如通过HTTP来上传文件呢?不需要头疼,这些问题有了“它”就很容易解决了! &lt;br&gt;我们不可能列举所有可能的顽固,我们会针对几种最常见的问题进行处理。当然了,正如前面说到的,如果我们自己使用java.net....

    精通ANDROID 3(中文版)1/2

    11.1.7 使用HttpURLConnection  11.1.8 使用AndroidHttpClient  11.1.9 使用后台线程(AsyncTask)  11.1.10 使用AsyncTask处理配置更改  11.1.11 使用DownloadManager获取文件  11.2 使用Android服务  ...

    精通Android 3 (中文版)2/2

    11.1.7 使用HttpURLConnection  11.1.8 使用AndroidHttpClient  11.1.9 使用后台线程(AsyncTask)  11.1.10 使用AsyncTask处理配置更改  11.1.11 使用DownloadManager获取文件  11.2 使用Android服务  ...

Global site tag (gtag.js) - Google Analytics