`
dreamoftch
  • 浏览: 492743 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

HttpURLConnection 多文件上传 和 参数

阅读更多
修改过的:
客户端:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
public class t {
	public static void main(String[] args) throws IOException {
		URL postUrl = new URL("http://localhost:8080/test_client/callback.action");
        HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();
        connection.setDoOutput(true);                
        connection.setDoInput(true);
        connection.setRequestMethod("POST");
        connection.setUseCaches(false);
        connection.setInstanceFollowRedirects(true);
        connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
        String content = "fileInfo="+URLEncoder.encode("file1", "utf-8")+"&param="+URLEncoder.encode("pppp","utf-8");//多个参数中间用&连接
        out.writeBytes(content);
        out.flush();
        out.close(); // flush and close
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line;
        System.out.println(" ============================= ");
        System.out.println(" Contents of post request ");
        System.out.println(" ============================= ");
        while ((line = reader.readLine()) != null) {
                System.out.println(line);
        }
        System.out.println(" ============================= ");
        System.out.println(" Contents of post request ends ");
        System.out.println(" ============================= ");
        reader.close();
 }
}
 
 
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import com.lubansoft.test.upload.po.UploadRecord;

public class TestClient {

	public static void main(String[] args) {
		TestClient client = new TestClient();
		client.upload();
	}

	private void upload() {
		try {
			String boundary = "------WebKitFormBoundaryUey8ljRiiZqhZHBu";
			String url = "http://localhost:8080/upload/FileUpLoad";
			URL u = new URL(url);
			HttpURLConnection conn = (HttpURLConnection) u.openConnection();
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setUseCaches(false);
			conn.setRequestMethod("POST");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("Charsert", "UTF-8");
			conn.setRequestProperty("Content-Type",
					"multipart/form-data;boundary=" + boundary);
			// 指定流的大小,当内容达到这个值的时候就把流输出
			conn.setChunkedStreamingMode(10240);
			OutputStream out = new DataOutputStream(conn.getOutputStream());
			byte[] end_data = ("\r\n--" + boundary + "--\r\n").getBytes();// 定义最后数据分隔线
			List<String> list  = new ArrayList<String>();
			list.add("e:/userInfo.properties");
			list.add("e:/email.html");
			StringBuilder sb = new StringBuilder();
			//添加form属性
			sb.append("--");
			sb.append(boundary);
			sb.append("\r\n");
			sb.append("Content-Disposition: form-data; name=\"username\"");
			sb.append("\r\n\r\n");
			sb.append("hello word");
			out.write(sb.toString().getBytes("utf-8"));
			out.write("\r\n".getBytes("utf-8"));
			
			int leng = list.size();
			for (int i = 0; i < leng; i++) {
				String fname = list.get(i);
				File file = new File(fname);
				sb = new StringBuilder();
				sb.append("--");
				sb.append(boundary);
				sb.append("\r\n");
				sb.append("Content-Disposition: form-data;name=\"file" + i
						+ "\";filename=\"" + file.getName() + "\"\r\n");
				sb.append("Content-Type:application/octet-stream\r\n\r\n");
				byte[] data = sb.toString().getBytes();
				out.write(data);
				DataInputStream in = new DataInputStream(new FileInputStream(
						file));
				int bytes = 0;
				byte[] bufferOut = new byte[1024];
				while ((bytes = in.read(bufferOut)) != -1) {
					out.write(bufferOut, 0, bytes);
				}
				out.write("\r\n".getBytes()); // 多个文件时,二个文件之间加入这个
				in.close();
			}
			out.write(end_data);
			out.flush();
			out.close();
			// 定义BufferedReader输入流来读取URL的响应
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));
			String line = null;
			while ((line = reader.readLine()) != null) {
				System.out.println(line);
			}
		} catch (Exception e) {
			System.out.println("发送POST请求出现异常!" + e);
			e.printStackTrace();
		}
	}

}
 服务器端:
package com.lubansoft.test.upload.web.servlet;

import java.io.*;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * 
 * @author Administrator
 * 文件上传
 * 具体步骤:
 * 1)获得磁盘文件条目工厂 DiskFileItemFactory 要导包
 * 2) 利用 request 获取 真实路径 ,供临时文件存储,和 最终文件存储 ,这两个存储位置可不同,也可相同
 * 3)对 DiskFileItemFactory 对象设置一些 属性
 * 4)高水平的API文件上传处理  ServletFileUpload upload = new ServletFileUpload(factory);
 * 目的是调用 parseRequest(request)方法  获得 FileItem 集合list ,
 *     
 * 5)在 FileItem 对象中 获取信息,   遍历, 判断 表单提交过来的信息 是否是 普通文本信息  另做处理
 * 6)
 *    第一种. 用第三方 提供的  item.write( new File(path,filename) );  直接写到磁盘上
 *    第二种. 手动处理  
 *
 */
public class FileUpLoad extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");	//设置编码
		
		//获得磁盘文件条目工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//获取文件需要上传到的路径
		HttpSession session = request.getSession();
		String path = session.getServletContext().getRealPath("/uploadFiles");
		
		//如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
		//设置暂时存放的 存储室 , 这个存储室,可以和 最终存储文件 的目录不同
		/**
		 * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上, 
		 * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的 
		 * 然后再将其真正写到 对应目录的硬盘上
		 */
		factory.setRepository(new File(path));
		//设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
		factory.setSizeThreshold(1024*1024) ;
		
		//高水平的API文件上传处理
		ServletFileUpload upload = new ServletFileUpload(factory);
		
		
		try {
			//可以上传多个文件
			List<FileItem> list = (List<FileItem>)upload.parseRequest(request);
			
			for(FileItem item : list)
			{
				//获取表单的属性名字
				String name = item.getFieldName();
				
				//如果获取的 表单信息是普通的 文本 信息
				if(item.isFormField())
				{					
					//获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的
					String value = item.getString() ;
					
					request.setAttribute(name, value);
				}
				//对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些
				else
				{
					/**
					 * 以下三步,主要获取 上传文件的名字
					 */
					//获取路径名
					String value = item.getName() ;
					if(value == null || value.equals("")){
						continue;
					}
					//索引到最后一个反斜杠
					int start = value.lastIndexOf("\\");
					//截取 上传文件的 字符串名字,加1是 去掉反斜杠,
					String filename = value.substring(start+1);
					
					request.setAttribute(name, filename);
					
					//真正写到磁盘上
					//它抛出的异常 用exception 捕捉
					
					//item.write( new File(path,filename) );//第三方提供的
					
					//手动写的
					OutputStream out = new FileOutputStream(new File(path,filename));
					
					InputStream in = item.getInputStream() ;
					
					int length = 0 ;
					byte [] buf = new byte[1024] ;
					
					System.out.println("获取上传文件的总共的容量:"+item.getSize());

					// in.read(buf) 每次读到的数据存放在   buf 数组中
					while( (length = in.read(buf) ) != -1)
					{
						//在   buf 数组中 取出数据 写到 (输出流)磁盘上
						out.write(buf, 0, length);
					    
					}
					
					in.close();
					out.close();
				}
			}
			
			
			
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (Exception e) {
			// TODO Auto-generated catch block
			
			e.printStackTrace();
		}
		
		
		request.getRequestDispatcher("fileDemo.jsp").forward(request, response);
		

	}

}
 
 
 
分享到:
评论

相关推荐

    HttpURLConnection servlet 多文件参数 断点上传

    总之,`HttpURLConnection`与Servlet配合处理多文件参数和断点上传,需要理解HTTP协议、多部分表单数据、流式上传以及服务器端的相应处理。在实际项目中,根据需求选择合适的技术和库,优化代码以提升性能和用户体验...

    JAVA通过HttpURLConnection 上传和下载文件的方法

    JAVA通过HttpURLConnection上传和下载...这些方法可以帮助开发者快速实现文件上传和下载的功能,从而提高开发效率和质量。同时,HttpURLConnection也可以用于发送其他类型的HTTP请求,例如GET、POST、PUT、DELETE等。

    HttpURLConnection实现三方接口调用,带有FILE文件参数

    HttpURLConnection实现三方接口HTTP调用调用,带有FILE文件参数

    Java自带的HttpURLConnection访问接口实现文件上传

    在本文中,我们将深入探讨如何使用HttpURLConnection实现文件上传,同时也会涉及普通参数的传递。 首先,我们需要理解HTTP请求的基本结构。HTTP请求通常由以下几个部分组成:请求行、请求头、空行和请求体。在文件...

    使用HttpUrlConnection实现上传文件 服务器端代码

    在Java编程环境中,当需要与Web服务器交互,例如上传文件时,`HttpURLConnection`是一个常见的选择,因为它提供了灵活且高效的方式。...在实际项目中,可能还需要处理错误、进度反馈、多文件上传等复杂情况。

    Java 中HttpURLConnection附件上传的实例详解

    * 高效:HttpURLConnection可以实现高效的数据传输,适合大文件上传。 * 广泛支持:HttpURLConnection是Java语言中的标准类,广泛支持各种操作系统和服务器。 然而,使用HttpURLConnection实现附件上传也存在一些...

    Android上传单文件和多文件(后台使用MultipartFile)

    在实际开发中,Android单文件和多文件上传是一个相对复杂的流程,涉及到客户端与服务器端的交互,理解并熟练掌握这一过程对提升Android应用的用户体验至关重要。通过不断实践和优化,可以打造出高效、稳定且用户友好...

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

    在Java编程中,发送POST请求并上传文件是一个常见的任务,特别是在与服务器进行数据交互时。在本场景中,我们使用`HttpURLConnection`类...通过这种方式,你可以实现自定义的文件上传逻辑,而不依赖于特定的库或框架。

    android 选择文件上传至服务器 包含服务器代码

    - 大多数服务器要求文件上传使用`multipart/form-data`格式,因为它可以携带多个部分,包括文件和额外的参数。 - 在Android客户端,可以使用`HttpURLConnection`的`setFixedLengthStreamingMode()`或`...

    android上传文件到服务器(客户端加服务端源码)

    本教程将深入探讨如何实现这一功能,同时提供客户端和服务端的源码示例,特别关注多文件上传的处理。 首先,客户端部分是Android应用的核心,负责与用户交互并执行文件上传操作。Android SDK提供了多种方式来实现...

    android和tomcat文件上传和数据交互

    综上所述,"android和tomcat文件上传和数据交互"这个主题涵盖了Android客户端开发、网络编程、文件操作、Struts2框架的使用、Tomcat服务器配置、以及JSON或XML数据交换等多个技术点。在实际项目中,开发者需要熟练...

    封装httpurlconnection

    为了进一步增强封装的灵活性,可以考虑支持PUT、DELETE等其他HTTP方法,同时添加支持上传文件、下载文件的功能。另外,可以使用线程池管理并发请求,提高性能。 总的来说,封装HTTPURLConnection是一项基础但重要的...

    安卓STE文件上传架构

    5. **集成与使用**:由于提供了详细的说明文档(安卓STE文件上传架构说明.doc),开发者可以根据文档指导,将安卓端和服务器端的jar包导入项目,配置好相关参数,快速实现文件上传功能。 综上所述,"安卓STE文件...

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

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

    android之网络文件上传下载源码.pdf

    在 Android 中,我们可以使用 HttpUrlConnection 或者 OkHttp 等库来实现文件上传下载。 五、实现文件上传下载的步骤 1. 创建文件上传下载的界面,包括文件路径输入框和上传下载按钮。 2. 获取文件路径和参数信息...

    Android文件上传.rar

    本文将详细解析如何在Android系统中实现文件上传,主要围绕"Android文件上传"这一主题展开,结合提供的博客链接以及压缩包内的示例代码(test和struts2fileupload)进行说明。 首先,理解文件上传的基本流程至关...

    Android实现多参数文件和数据上传

    这里我们主要关注使用`HttpURLConnection`来实现多参数文件上传。关键在于构造符合HTTP协议格式的请求体,并设置正确的请求头。 在上述代码中,我们定义了一个名为`mulpost`的方法,接收三个参数:`actionUrl`...

    Golang+Android基于HttpURLConnection实现的文件上传功能示例

    在本文中,我们将深入探讨如何使用Golang和Android的HttpURLConnection来实现文件上传功能。首先,我们要明白,文件上传是Web应用中常见的功能,通常涉及客户端(如Android应用)将本地文件发送到服务器进行存储或...

    Android应用源码之安卓图片上传和文件上传带jsp服务端源码-IT计算机-毕业设计.zip

    - **Multipart上传**:在文件上传中,通常使用`MultipartEntity`或`RequestBody`创建多部分表单数据,包含文件和额外参数。 2. **Android权限管理** - 在Android 6.0及以上版本,需要在运行时动态请求`READ_...

Global site tag (gtag.js) - Google Analytics