android通过http传输文件到servlet

java.lang.NoClassDefFoundError代码部分来自网络,这里引用的是apache给的开源jar包,实现很方便的,(commons-httpclient-3.1android客户端使用),(commons-fileupload-1.2.2,commons-io-2.4,servlet的使用,记得把后面两个jar包放在 C:\Program Files\Java\jdk1.7.0_09\jre\lib\ext目录下)

下面贴贴代码吧:

httpclict如下:

package com.example.http ;

import java.io.File ;

import org.apache.commons.httpclient.HttpClient ;
import org.apache.commons.httpclient.HttpStatus ;
import org.apache.commons.httpclient.methods.PostMethod ;
import org.apache.commons.httpclient.methods.multipart.FilePart ;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity ;
import org.apache.commons.httpclient.methods.multipart.Part ;

public class Hclient

	{
	/*
	 * private Context mContext ;
	 * 
	 * public Hclient ( Context c ) { this.mContext = c ; }
	 */

	public void UpLoadFile ( String str)
		{

			String targetURL = null ;// TODO 指定URL
			File targetFile = null ;// TODO 指定上传文件
			targetFile = new File ( str) ;
			targetURL = "http://192.168.1.100:8081/http/Http" ; // servleturl
			PostMethod filePost = new PostMethod ( targetURL ) ;
			try
				{
					// 通过以下方法可以模拟页面参数提交
					// filePost.setParameter("name", "中文");
					// filePost.setParameter("pass", "1234");
					Part [ ] parts =
						{ new FilePart ( targetFile.getName ( ) , targetFile ) } ;
					filePost.setRequestEntity ( new MultipartRequestEntity (
					        parts , filePost.getParams ( ) ) ) ;
					HttpClient client = new HttpClient ( ) ;
					client.getHttpConnectionManager ( ).getParams ( )
					        .setConnectionTimeout ( 5000 ) ;
					int status = client.executeMethod ( filePost ) ;
					if ( status == HttpStatus.SC_OK )
						{
							System.out.println ( "上传成功" ) ;
							// 上传成功
						}
					else
						{
							System.out.println ( "上传失败" ) ;
							// 上传失败
						}
				}
			catch ( Exception ex )
				{
					ex.printStackTrace ( ) ;
				}
			finally
				{
					filePost.releaseConnection ( ) ;

				}
		}
	}

Activity如下:


package com.example.http ;

import android.app.Activity ;
import android.os.Bundle ;
import android.os.StrictMode ;
import android.view.View ;
import android.widget.Button ;

public class HttpMainActivity extends Activity
	{

		private Button	mButton ;
		private String	str1	= "/sdcard/http.txt" ;
		private String	str2	= "/sdcard/http.mp3" ;
		private int		mFlag	= 0 ;
		Hclient			hclient ;

		@ Override
		protected void onCreate( Bundle savedInstanceState )
			{
				super.onCreate ( savedInstanceState ) ;
				StrictMode
						.setThreadPolicy ( new StrictMode.ThreadPolicy.Builder ( )
								.detectDiskReads ( ).detectDiskWrites ( )
								.detectNetwork ( ).penaltyLog ( ).build ( ) ) ;
				StrictMode.setVmPolicy ( new StrictMode.VmPolicy.Builder ( )
						.detectLeakedSqlLiteObjects ( )
						.detectLeakedClosableObjects ( ).penaltyLog ( )
						.penaltyDeath ( ).build ( ) ) ;
				setContentView ( R.layout.activity_http_main ) ;
				mButton = ( Button ) findViewById ( R.id.button ) ;
				hclient = new Hclient ( ) ;
				mButton.setOnClickListener ( new View.OnClickListener ( )
					{

						@ Override
						public void onClick( View v )
							{
								mFlag ++ ;
								if ( mFlag == 1 )
									{
										hclient.UpLoadFile ( str1 ) ;
									}
								else
									if ( mFlag == 2 )
										{
											hclient.UpLoadFile ( str2 ) ;
										}
									else
										{

										}
							}
					} ) ;
			}

	}

记得加权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>

t添加jar包的时候可能编译不过,java.lang.NoClassDefFoundError错误,下面给出办法:

1,添加jar包

2,把jar包放在libs文件中,如图


下面是servlet代码:

import java.io.File ;
import java.io.IOException ;
import java.util.Iterator ;
import java.util.List ;

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

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

public class TestServlets extends HttpServlet

	{
		private String	uploadPath	= "D:\\temp" ;				// 上传文件的目录
		private String	tempPath	= "d:\\temp\\buffer\\" ;	// 临时文件目录
		private File	tempPathFile ;

		public void init( ) throws ServletException
			{
				File uploadFile = new File ( uploadPath ) ;
				if ( ! uploadFile.exists ( ) )
					{
						uploadFile.mkdirs ( ) ;
					}
				File tempPathFile = new File ( tempPath ) ;
				if ( ! tempPathFile.exists ( ) )
					{
						tempPathFile.mkdirs ( ) ;
					}
			}

		public void doPost( HttpServletRequest request ,
				HttpServletResponse response ) throws ServletException ,
				IOException
			{
				try
					{
						// Create a factory for disk-based file items
						DiskFileItemFactory factory = new DiskFileItemFactory ( ) ;
						// Set factory constraints
						factory.setSizeThreshold ( 4096 ) ; // 设置缓冲区大小,这里是4kb
						factory.setRepository ( tempPathFile ) ;// 设置缓冲区目录
						// Create a new file upload handler
						ServletFileUpload upload = new ServletFileUpload (
								factory ) ;
						// Set overall request size constraint
						upload.setSizeMax ( 4194304 ) ; // 设置最大文件尺寸,这里是4MB
						List < FileItem > items = upload
								.parseRequest ( request ) ;// 得到所有的文件
						Iterator < FileItem > i = items.iterator ( ) ;
						while ( i.hasNext ( ) )
							{
								FileItem fi = ( FileItem ) i.next ( ) ;
								String fileName = fi.getName ( ) ;
								if ( fileName != null )
									{
										File fullFile = new File (
												fi.getName ( ) ) ;
										File savedFile = new File ( uploadPath ,
												fullFile.getName ( ) ) ;
										fi.write ( savedFile ) ;
									}
							}
						System.out.print ( "upload succeed" ) ;
					}
				catch ( Exception e )
					{
						System.out.println ( e.getMessage ( ) ) ;
						// 可以跳转出错页面
						e.printStackTrace ( ) ;
					}
			}
	}


点击打开链接,点击这个是jar包的下载地址,我已经上传csdn了



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值