android通过http上传文件(图片)
16lz
2021-01-26
在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";}
这里只是实现一个接收接口。
更多相关文章
- android中UDP编程的注意事项
- Anroid Receiver
- Android中的线程总结
- android中如何发送及接收数据(两种方法)?
- Android推送服务(GCM)
- Android(安卓)Touch 事件总结
- android 仿京东抢购上下轮播消息
- Android(安卓)Handler消息处理顺序分析
- 环信集成