`
zhaoshengxuan108
  • 浏览: 26371 次
  • 性别: 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();
	}
	
}
分享到:
评论

相关推荐

    本示例使用HttpUrlConnection实现上传文件

    在Android开发中,有时我们需要将本地的文件...通过理解以上步骤和注意事项,开发者可以有效地利用HttpURLConnection在Android应用中实现代理文件上传功能。同时,了解服务器端如何接收和处理这些文件也是至关重要的。

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

    以下是一个简化的示例代码片段,演示如何使用`HttpURLConnection`上传文件: ```java import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class FileUploader { public static ...

    android HttpURLConnection上传图片demo

    下面我们将详细讨论如何利用HttpURLConnection上传图片。 首先,我们需要获取到用户选择或拍摄的图片。这通常通过Intent来完成,例如启动系统的相机应用或者文件选择器,让用户选择本地图片。一旦图片被选定,可以...

    Android程序开发通过HttpURLConnection上传文件到服务器

    在Android中,使用`HttpURLConnection`进行文件上传的步骤如下: 1. 创建`HttpURLConnection`实例并连接到服务器的上传接口URL。 2. 设置请求方法为`POST`。 3. 设置`Content-Type`为`multipart/form-data`,并指定...

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

    在本文中,我们将深入探讨如何利用HttpURLConnection实现文件上传和接收的功能。 首先,我们看客户端(发送文件)的实现: 1. 创建URL对象,指定上传文件的服务器地址和文件名参数,例如:`...

    Android-使用HttpURLConnection实现断点续传

    本文将详细介绍如何利用HttpURLConnection实现Android应用中的断点续传功能。 首先,理解断点续传的概念。断点续传是指当下载或上传文件过程中因网络问题中断后,可以从上次中断的位置继续进行,而不是重新开始。这...

    Netroid框架和HttpURLConnection类的文件下载demo

    本文将深入探讨“Netroid框架”和“HttpURLConnection类”的使用,并通过一个文件下载的示例来阐述如何利用它们进行文件传输,同时关注性能指标如下载速度。 **Netroid框架** Netroid是一个轻量级的Android网络...

    远程连接服务器HttpURLConnection

    这些文件可能包含了如何利用`HttpURLConnection`进行更复杂交互的示例,比如处理JSON响应、使用HTTPS安全连接、实现断点续传等。 总结来说,`HttpURLConnection`是Java中进行HTTP通信的基础工具,它提供了连接、...

    java实现利用HTTP基于servlet上传文件至服务器.pdf

    "Java 实现利用 HTTP 基于 Servlet 上传文件至服务器" 文件上传概述 文件上传是指客户端将文件传输到服务器端的过程。在 Web 开发中,文件上传是非常常见的操作,例如上传头像、上传文件等。在 Java 中,可以使用 ...

    android 文件上传(多个或单个),图片上传

    总结,Android的文件上传涉及文件选择、读取、压缩、转换为流,以及利用Multipart请求将数据发送到服务器。同时,配合JSON数据可以传递更多的业务信息。理解并熟练运用这些技术,能够帮助开发者实现高效且稳定的文件...

    android 文件上传含进度条

    在上传文件前,我们通常会先将文件读入到内存或流中,然后通过网络接口(如HttpURLConnection或者第三方库如Retrofit、OkHttp)发送到服务器。 接着,文件上传过程中显示进度条涉及网络编程和UI更新的知识。Android...

    android客户端上传文件到服务器端

    1. **Android客户端上传文件**:在Android应用中,我们通常使用`HttpURLConnection`或第三方库如`OkHttp`进行网络请求。文件上传是通过POST请求实现的,其中文件以多部分/表单数据格式发送。在创建请求时,需要设置...

    多线程上传和下载HttpURLConnection.pdf

    本篇内容主要涉及如何利用`HttpURLConnection`实现多线程下载大文件,这是在CS(计算机科学)领域中常见的网络编程技术。 1. **创建Web项目并发布** 在运行包含多线程下载代码的Java程序之前,你需要先创建一个Web...

    HttpURLConnection和简单的Android服务器交互

    合理利用它,可以构建高效、安全的网络通信机制,实现丰富的功能,如登录注册、数据同步、文件上传下载等。同时,随着Retrofit、OkHttp等现代网络库的出现,开发者可以更便捷地进行网络编程,但理解底层原理仍然是...

    java上传文件到服务器

    例如,使用Spring Boot时,可以利用`@RequestParam`注解接收上传的文件,并通过`FileSystemResource`或`PathResource`来处理。 在提供的压缩包文件“bed90cbdb33448b5a1d25bd0eb7471fd”中,可能包含了实现上述功能...

    java 实现上传文件到远程服务器

    本篇文章将详细介绍如何利用Java编程语言结合Spring MVC框架来实现文件的远程上传功能。具体实现过程中,我们会采用HTTP协议中的`POST`方法,并通过`multipart/form-data`编码格式来传输数据。 #### 关键概念和技术...

    android文件上传控件

    文件上传通常涉及到网络请求,Android提供了多种方式来实现,如使用HttpURLConnection、HttpClient(已废弃)或第三方库如Volley、OkHttp等。以OkHttp为例,它是一个高效的HTTP客户端,支持异步和同步请求。创建一个...

    android客户端向java服务器端上传文件(完整版)

    3. **HTTP通信**:上传文件通常使用HTTP的POST或PUT方法,Android应用通常会使用`HttpURLConnection`或第三方库如OkHttp来创建网络请求。文件内容通常会被编码为`multipart/form-data`格式,这样可以在单个HTTP请求...

    基于安卓实现的文件上传

    3. 将`HttpURLConnection`对象设置为POST请求,因为文件上传通常使用POST方法。 4. 设置请求头,比如Content-Type,用于指定上传的数据类型。 5. 使用`setDoOutput(true)`开启写入模式,准备写入数据。 6. 通过`...

    安卓STE文件上传架构

    - HTTP客户端:利用Android的HttpURLConnection或者第三方库如OkHttp,建立与服务器的连接,发起POST请求并将文件数据发送出去。 - 进度显示:提供UI反馈,展示文件上传进度,提升用户体验。 - 错误处理:对网络...

Global site tag (gtag.js) - Google Analytics