1. 程式人生 > >android通過servlet伺服器儲存檔案到手機

android通過servlet伺服器儲存檔案到手機

伺服器端:(手機和電腦連線的同一個WIFI)

package com;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

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

import sun.misc.BASE64Encoder;

public class download extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	public download() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

//		response.setContentType("text/html");
//		PrintWriter out = response.getWriter();
//		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
//		out.println("<HTML>");
//		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
//		out.println("  <BODY>");
//		out.print("    This is ");
//		out.print(this.getClass());
//		out.println(", using the GET method");
//		out.println("  </BODY>");
//		out.println("</HTML>");
//		out.flush();
//		out.close();
		doPost(request, response);
		
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		//request.setCharacterEncoding("utf-8");////這句至關重要,不然中文的檔名稱顯示亂碼
		PrintWriter out = response.getWriter();
//		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
//		out.println("<HTML>");
//		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
//		out.println("  <BODY>");
//		out.print("    This is ");
//		out.print(this.getClass());
//		out.println(", using the POST method");
//		out.println("  </BODY>");
//		out.println("</HTML>");
		out.print(GetImageStr());///輸出檔案的字串
		out.flush();
		out.close();
		
		
		
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occurs
	 */
	public void init() throws ServletException {
		// Put your code here
	}
    public static String GetImageStr()  
    {//將圖片檔案轉化為位元組陣列字串,並對其進行Base64編碼處理  
       // String imgFile = "d://test.jpg";//待處理的圖片  
        
    	//String imgFile="F://upload//1.jpg";////可以
   // 	String imgFile="F://upload//軟工大作業.ppt";////可以
    	String imgFile="F://upload//愛的勇氣.mp3";//不可以
    //	String imgFile="F://upload//upload.rar";//可以
    	InputStream in = null;  
        byte[] data = null;  
        //讀取圖片位元組陣列  
        try   
        {  
            in = new FileInputStream(imgFile);          
            data = new byte[in.available()];  
            in.read(data);  
            in.close();  
        }   
        catch (IOException e)   
        {  
            e.printStackTrace();  
        }  
        //對位元組陣列Base64編碼  
        BASE64Encoder encoder = new BASE64Encoder();  
        return encoder.encode(data);//返回Base64編碼過的位元組陣列字串  
    } ///GetImageStr 
}
手機端:
package com.example.getfile_2;

import java.io.FileOutputStream;
import java.io.OutputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

	private static final int REQUEST_TIMEOUT = 5 * 1000;// 設定請求超時10秒鐘
	private static final int SO_TIMEOUT = 10*60 * 1000; // 設定請求超時時間10秒鐘
	private static final int LOGIN_OK = 1;
	private Button button1, button2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button1 = (Button) findViewById(R.id.button1);

		button2 = (Button) findViewById(R.id.button2);

		button1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO 自動生成的方法存根
				Log.i("button1", "button1");
				fun_HttpPost();

			}
		});
	}

	public void fun_HttpPost() {
		new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO 自動生成的方法存根
				String urlStr = "http://192.168.0.102:8080/download/servlet/download";
				HttpPost request = new HttpPost(urlStr);

				try {
					HttpClient client = getHttpClient();
					// 執行請求返回相應
					HttpResponse response = client.execute(request);
					// 判斷是否請求成功
					if (response.getStatusLine().getStatusCode() == 200) {
						// 獲得響應資訊
						String responseMessage = EntityUtils.toString(response
								.getEntity());
						Log.i("responseMessage", responseMessage + ",長度:"
								+ responseMessage.length());
						GenerateImage(responseMessage);
						Log.i("生成成功", "生成成功");
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

			}// //run()
		}).start();
	}// /fun_register()

    //base64字串轉化成圖片  
    public static boolean GenerateImage(String imgStr)  
    {   //對位元組陣列字串進行Base64解碼並生成圖片  
        if (imgStr == null) //影象資料為空  
            return false;  
        Decoder.BASE64Decoder decoder = new Decoder.BASE64Decoder();  
        try   
        {  
            //Base64解碼  
            byte[] b = decoder.decodeBuffer(imgStr);  
            for(int i=0;i<b.length;++i)  
            {  
                if(b[i]<0)  
                {//調整異常資料  
                    b[i]+=256;  
                }  
            }  
            //生成jpeg圖片  
           // String imgFilePath = "d://222.jpg";//新生成的圖片  
          //  String imgFilePath =  "F://upload//1_2.jpg";///可以
            //String imgFilePath =  "F://upload//軟工大作業_2.ppt";//可以
//            String imgFilePath="F://upload//upload_2.rar";
          //  String imgFilePath="/sdcard/1spray/1_2.jpg";//可以
           // String imgFilePath =  "/sdcard/1spray/軟工大作業_2.ppt";//可以
            String imgFilePath ="/sdcard/1spray/愛的勇氣_2.mp3";//9M不行了?????
            OutputStream out = new FileOutputStream(imgFilePath);      
            out.write(b);  
            out.flush();  
            out.close();  
            return true;  
        }   
        catch (Exception e)   
        {  
            return false;  
        }  
    } 
	// 初始化HttpClient,並設定超時
	public HttpClient getHttpClient() {
		BasicHttpParams httpParams = new BasicHttpParams();
		HttpConnectionParams.setConnectionTimeout(httpParams, REQUEST_TIMEOUT);
		HttpConnectionParams.setSoTimeout(httpParams, SO_TIMEOUT);
		HttpClient client = new DefaultHttpClient(httpParams);
		return client;
	}// /public HttpClient getHttpClient()
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_marginLeft="25dp"
        android:layout_marginTop="142dp"
        android:layout_toRightOf="@+id/textView1"
        android:text="ButtonPost" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button1"
        android:layout_below="@+id/button1"
        android:layout_marginTop="34dp"
        android:text="ButtonGet" />

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.getfile_2"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="16" />
        <!-- 使用網路功能所需許可權 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- SDK離線地圖和cache功能需要讀寫外部儲存器 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>