用Httppost以二进制数据形式上传文件

red_drug000 2014-11-21 05:24:43
如题,用java来实现。
请给出具体代码,谢谢。
...全文
5133 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
忘年之 2014-11-24
  • 打赏
  • 举报
回复

private static final String BOUNDARYSTR = "XMKSSS***********";
	private static final String BOUNDARY = "--" + BOUNDARYSTR + "\r\n";
private static void sendPost(String urlString, String filePath) {
		HttpURLConnection urlConnection = null;
		FileInputStream fi = null;
        OutputStream o = null;
		try {
			Map<String, String> parameters = new HashMap<String, String>();
			parameters.put("fileName", "文件.xls");
//			parameters.put("fileName", filePath);
			Map<String, String> propertys = getHeader();
			URL url;
			url = new URL(urlString);
			urlConnection = (HttpURLConnection) url.openConnection();
			urlConnection.setRequestMethod("POST");

			urlConnection.setDoOutput(true);
			urlConnection.setDoInput(true);
			urlConnection.setUseCaches(false);

			urlConnection.setRequestProperty("Content-type", "multipart/form-data;boundary=" + BOUNDARYSTR);
			if (propertys != null)
				for (String key : propertys.keySet()) {
					urlConnection.addRequestProperty(key, propertys.get(key));
				}
			urlConnection.connect();
			BufferedOutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
		      
		    if (parameters != null) {
		    	StringBuffer param = new StringBuffer();
		    	for (String key : parameters.keySet()) {
		    		param.append(BOUNDARY);
		    		param.append("Content-Disposition:form-data;name=\"");
		    		param.append(key);
		    		param.append("\"\r\n\r\n");
		    		param.append(parameters.get(key));
		    		param.append("\r\n");
		    	}
		    	out.write(param.toString().getBytes());
		    }
		    File file = new File(filePath);
		    out.write(BOUNDARY.getBytes());
		    StringBuilder filenamesb = new StringBuilder();
		    filenamesb.append("Content-Disposition:form-data;Content-Type:application/octet-stream;name=\"uploadfile\";filename=\"");
		    filenamesb.append(file.getName() + "\"\r\n\r\n");
			out.write(filenamesb.toString().getBytes());
			FileInputStream fis = new FileInputStream(file);
			byte[] buffer = new byte[8192]; // 8k
			int count = 0;
			// 读取文件
			while ((count = fis.read(buffer)) != -1) {
				out.write(buffer, 0, count);
			}
			out.write("\r\n\r\n".getBytes());
		    fis.close();
		    out.write(("--" + BOUNDARYSTR + "--\r\n").getBytes());
		    out.flush();
		    out.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
                if (fi != null) {
                    fi.close();
                }
                if (o != null) {
                    o.close();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
			if (urlConnection != null) {
				urlConnection.disconnect();
			}
		}
	}
早期的代码,你自己调试下
red_drug000 2014-11-24
  • 打赏
  • 举报
回复
引用 1 楼 magi1201 的回复:
这个不就是文件上传嘛 给你个servlet3.0的文件上传 页面表单 <form action="sf" enctype="multipart/form-data" method="get"> username: <input type="text" name="username" /><br> file: <input type="file" name="filename" /><br> <input type="submit" value="Submit" /> </form> servlet头注解配置 @WebServlet("/sf") @MultipartConfig public class SingleFileUpload extends HttpServlet { doPost 方法

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	Enumeration<String> heads = request.getHeaderNames();
	System.out.println("request.getHeaderNames()");
	while (heads.hasMoreElements()) {
		String header = heads.nextElement();
		System.out.println(header + "=" + request.getHeader(header));
	}
	Part part = request.getPart("filename");
	Collection<String> headerNames = part.getHeaderNames();
	System.out.println("part.getHeaderNames()");
	for (String header : headerNames) {
		System.out.println(header + "=" + part.getHeader(header));
	}
	InputStream is = part.getInputStream();
	String filename = new String(getFilename(part).getBytes(), "UTF-8");
	File file = new File("D:\\fileupload");
	if (!file.exists() || !file.isDirectory()) {
		file.mkdir();
	}
		
	FileOutputStream fos = new FileOutputStream(new File(file + File.separator + filename));
	byte[] buf = new byte[1024];
	while (is.read(buf) != -1) {
		fos.write(buf);
	}
	fos.flush();
	fos.close();
	is.close();
	PrintWriter out = response.getWriter();
	out.println("file upload success");
}
	
public String getFilename(Part part) {
	String contentDispositionHeader = part.getHeader("content-disposition");
	String[] elements = contentDispositionHeader.split(";");
	for (String element : elements) {
		if (element.trim().startsWith("filename")) {
			return element.substring(element.indexOf('=') + 1).trim().replace("\"", "");
		}
	}
	return null;
}
不是这个意思。 我开发了个接口,直接接收客户端发过来的二进制数据(request.getInputStream()),然后把文件存放到服务器。 现在我想要测试下接口,所以我模拟客户端(HttpPost)向服务器请求该接口。 现在我要的就是客户端发送二进制数据的代码。 发送数据类型Content-Type = “application/octet-stream”。
red_drug000 2014-11-24
  • 打赏
  • 举报
回复
if( file.exists() ){ InputStream is = new BufferedInputStream(new FileInputStream(file)); byte[] b = new byte[1024]; int len = -1; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while ( (len = is.read(b, 0, b.length)) != -1) { baos.write(b, 0, len); } baos.flush(); is.close(); HttpEntity entity = new ByteArrayEntity(baos.toByteArray()); 楼主有良心,解决了贴出来。
red_drug000 2014-11-24
  • 打赏
  • 举报
回复
引用 4 楼 cyf282501 的回复:

private static final String BOUNDARYSTR = "XMKSSS***********";
	private static final String BOUNDARY = "--" + BOUNDARYSTR + "\r\n";
private static void sendPost(String urlString, String filePath) {
		HttpURLConnection urlConnection = null;
		FileInputStream fi = null;
        OutputStream o = null;
		try {
			Map<String, String> parameters = new HashMap<String, String>();
			parameters.put("fileName", "文件.xls");
//			parameters.put("fileName", filePath);
			Map<String, String> propertys = getHeader();
			URL url;
			url = new URL(urlString);
			urlConnection = (HttpURLConnection) url.openConnection();
			urlConnection.setRequestMethod("POST");

			urlConnection.setDoOutput(true);
			urlConnection.setDoInput(true);
			urlConnection.setUseCaches(false);

			urlConnection.setRequestProperty("Content-type", "multipart/form-data;boundary=" + BOUNDARYSTR);
			if (propertys != null)
				for (String key : propertys.keySet()) {
					urlConnection.addRequestProperty(key, propertys.get(key));
				}
			urlConnection.connect();
			BufferedOutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
		      
		    if (parameters != null) {
		    	StringBuffer param = new StringBuffer();
		    	for (String key : parameters.keySet()) {
		    		param.append(BOUNDARY);
		    		param.append("Content-Disposition:form-data;name=\"");
		    		param.append(key);
		    		param.append("\"\r\n\r\n");
		    		param.append(parameters.get(key));
		    		param.append("\r\n");
		    	}
		    	out.write(param.toString().getBytes());
		    }
		    File file = new File(filePath);
		    out.write(BOUNDARY.getBytes());
		    StringBuilder filenamesb = new StringBuilder();
		    filenamesb.append("Content-Disposition:form-data;Content-Type:application/octet-stream;name=\"uploadfile\";filename=\"");
		    filenamesb.append(file.getName() + "\"\r\n\r\n");
			out.write(filenamesb.toString().getBytes());
			FileInputStream fis = new FileInputStream(file);
			byte[] buffer = new byte[8192]; // 8k
			int count = 0;
			// 读取文件
			while ((count = fis.read(buffer)) != -1) {
				out.write(buffer, 0, count);
			}
			out.write("\r\n\r\n".getBytes());
		    fis.close();
		    out.write(("--" + BOUNDARYSTR + "--\r\n").getBytes());
		    out.flush();
		    out.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
                if (fi != null) {
                    fi.close();
                }
                if (o != null) {
                    o.close();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
			if (urlConnection != null) {
				urlConnection.disconnect();
			}
		}
	}
早期的代码,你自己调试下
类型为Content-Type = “application/octet-stream”
姜小白- 2014-11-21
  • 打赏
  • 举报
回复
姜小白- 2014-11-21
  • 打赏
  • 举报
回复
这个不就是文件上传嘛 给你个servlet3.0的文件上传 页面表单 <form action="sf" enctype="multipart/form-data" method="get"> username: <input type="text" name="username" /><br> file: <input type="file" name="filename" /><br> <input type="submit" value="Submit" /> </form> servlet头注解配置 @WebServlet("/sf") @MultipartConfig public class SingleFileUpload extends HttpServlet { doPost 方法

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	Enumeration<String> heads = request.getHeaderNames();
	System.out.println("request.getHeaderNames()");
	while (heads.hasMoreElements()) {
		String header = heads.nextElement();
		System.out.println(header + "=" + request.getHeader(header));
	}
	Part part = request.getPart("filename");
	Collection<String> headerNames = part.getHeaderNames();
	System.out.println("part.getHeaderNames()");
	for (String header : headerNames) {
		System.out.println(header + "=" + part.getHeader(header));
	}
	InputStream is = part.getInputStream();
	String filename = new String(getFilename(part).getBytes(), "UTF-8");
	File file = new File("D:\\fileupload");
	if (!file.exists() || !file.isDirectory()) {
		file.mkdir();
	}
		
	FileOutputStream fos = new FileOutputStream(new File(file + File.separator + filename));
	byte[] buf = new byte[1024];
	while (is.read(buf) != -1) {
		fos.write(buf);
	}
	fos.flush();
	fos.close();
	is.close();
	PrintWriter out = response.getWriter();
	out.println("file upload success");
}
	
public String getFilename(Part part) {
	String contentDispositionHeader = part.getHeader("content-disposition");
	String[] elements = contentDispositionHeader.split(";");
	for (String element : elements) {
		if (element.trim().startsWith("filename")) {
			return element.substring(element.indexOf('=') + 1).trim().replace("\"", "");
		}
	}
	return null;
}

50,504

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧