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了



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章