android通过http上传文件(图片)

在android开发如何上传文件到服务器,这里使用http的post方法(不懂的东西可以上网补习一下)上传一个图片,给出了android部分代码和服务器部分代码。

andorid端

FileUploadTask是完成文件上传的类。

package com.android.TVwidget;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

class FileUploadTask extends AsyncTask<Object, Integer, Void> 
{  
	String urlServer;
	private String pathToOurFile;  
    long totalSize = 0;
    HttpURLConnection connection = null;  
    DataOutputStream outputStream = null;  
    DataInputStream inputStream = null;    
    String TAG = "FileUploadTask";
    String lineEnd = "\r\n";  
    String twoHyphens = "--";  
    String boundary = "*****";
    private Handler handler;
    
    public Handler setHandler(Handler hdl)
    {
    	this.handler = hdl;
    	return this.handler;
    }
    protected void init(String path, String server) {  
    	File uploadFile; 
    	pathToOurFile = path;
    	uploadFile = new File(pathToOurFile);  
    	Log.i(TAG,"pathToOurFile = "+pathToOurFile);
    	totalSize = uploadFile.length();
    	Log.i(TAG,"totalSize = "+totalSize);
    	urlServer = server;
    	return ;
    }
    
    @Override  
    protected void onPreExecute() { 
    	
    	/*文件上传提示*/
        Log.i(TAG, "onPreExecute");
    }  
    /*后台执行文件上传*/
    @Override  
    protected Void doInBackground(Object... arg0) {  

        long length = 0;  
        int progress;  
        int bytesRead, bytesAvailable, bufferSize;  
        byte[] buffer;  
        int maxBufferSize = 256 * 1024;  

        try {  
            FileInputStream fileInputStream = new FileInputStream(new File(  
                    pathToOurFile));  
            
			Log.i(TAG," doInBackground urlServer ="+urlServer);
			
			/*http链接参数设置*/
            URL url = new URL(urlServer);  
            connection = (HttpURLConnection) url.openConnection();  
            connection.setChunkedStreamingMode(256 * 1024); 
            connection.setDoInput(true);  
            connection.setDoOutput(true);  
            connection.setUseCaches(false);   
            connection.setRequestMethod("POST");  
            connection.setRequestProperty("Charset", "UTF-8");  
            connection.setRequestProperty("Content-Type",  
                    "multipart/form-data;boundary=" + boundary);  
            outputStream = new DataOutputStream(  
                    connection.getOutputStream());  
            outputStream.writeBytes(twoHyphens + boundary + lineEnd);  
            outputStream  
                    .writeBytes("Content-Disposition: form-data;name=\"img\";filename=\""  
                            + pathToOurFile + "\"" + lineEnd);  
            outputStream.writeBytes(lineEnd);  
            bytesAvailable = fileInputStream.available();  
            bufferSize = Math.min(bytesAvailable, maxBufferSize);  
            buffer = new byte[bufferSize];  

            // Read file   
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);  

            while (bytesRead > 0) {  
                outputStream.write(buffer, 0, bufferSize);  
                length += bufferSize;  
                progress = (int) ((length * 100) / totalSize);  
                publishProgress(progress);  

                bytesAvailable = fileInputStream.available();  
                bufferSize = Math.min(bytesAvailable, maxBufferSize);  
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);  
            }  
            outputStream.writeBytes(lineEnd);  
            outputStream.writeBytes(twoHyphens + boundary + twoHyphens  
                    + lineEnd);  
            publishProgress(100); 
            
            InputStream is = connection.getInputStream();   
            int ch;   
            StringBuffer sbf = new StringBuffer();   
            while ((ch = is.read()) != -1) {   
            sbf.append((char) ch);   
            }   
            fileInputStream.close();  
            outputStream.flush();  
            outputStream.close();
            
            /*图片完成上传后发送消息*/
            Message message = new Message();   
            Bundle b =new Bundle();                   
            b.putString("textStr", "finished-upload");                                                
            message.setData(b); 
            this.handler.sendMessage(message); 
        } catch (Exception ex) {   

        }  
        return null;  
    }  

    @Override  
    protected void onProgressUpdate(Integer... progress) {  
        //dialog.setProgress(progress[0]);  
    }  

    @Override  
    protected void onPostExecute(Void result) {  
        try {  
            //dialog.dismiss();  
            // TODO Auto-generated method stub   
        } catch (Exception e) {  
        }  
    }  

}  


类的使用

/*消息接收器*/
    Handler  handler = new Handler(){
        /* (non-Javadoc)
         * @see android.os.Handler#handleMessage(android.os.Message)
         */
        @Override
        public void handleMessage(Message msg) {
            Bundle b=msg.getData();
            String textStr=b.getString("textStr");
            Log.i(TAG, "textStr is: "+textStr);
            
            /*图片上传完成消息*/
            if(textStr!=null&&textStr.equals("finished-upload"))
            {
                mWebView.loadUrl("javascript:uploadFileFinished()"); 
            }
            else
            {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "截屏成功", Toast.LENGTH_LONG).show();
            }
            super.handleMessage(msg);
        }    
    };
...
FileUploadTask fileUploadTask = new FileUploadTask();
        	fileUploadTask.init(fullname, api);
        	fileUploadTask.setHandler(handler);
        	fileUploadTask.execute();
...

创建一个图片上传的任务然后进行初始化init,初始化参数fullname是文件全名如“/mnt/usb/sad1/pic1.jpg”,api是服务器接收图片的api如我实现的api是

“http://192.168.1.5:8080/clive-demo/api/v1/recommend?userId=123”

两参数都是字符类型。

然后创建一个消息接收器handler,接收图片上传完成的消息:

finished-upload


服务器端


@RequestMapping(value="recommend",method = RequestMethod.POST)
	public @ResponseBody String recommend(
			@RequestParam(value="userId") String userId,
			@RequestParam(value="img",required=false) MultipartFile img){
		logger.debug("saving");
//		imageDao.save(img);
		return "ok";
	}

这里只是实现一个接收接口。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值