您的位置:首页 > 理论基础 > 计算机网络

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

2013-03-07 17:49 357 查看
在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";
}


这里只是实现一个接收接口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐