編輯:Android開發實例
今天開始完成了,一個文件上傳的內容的實現,Android要實現文件上傳,可以利用Socket上傳,也可以模擬Web進行上傳,但是如果是使用第一種方式上傳,嚴格的話就得使用TCP,這樣容易生成系統死掉,或者是長時間等待,如果是UDP來傳,就容易造成數據丟失,因此在這裡選擇了Web進行上傳,使用Web進行上傳是模擬的Http Post上傳數據,當然,Post上傳數據的類,在網上找了一找,方式雖然很多,但是沒有一個感覺是我所使用的,所以參照原理之類的,進行了一下修改,算是做了一個參考。並且利用這個類完成了文件和表彰的上傳服務。
具體代碼如下:
文件與表單上傳類:
代碼
package com.UpLoadFileTest;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
public class PostFile {
//上傳代碼,第一個參數,為要使用的URL,第二個參數,為表單內容,第三個參數為要上傳的文件,可以上傳多個文件,這根據需要頁定
public static String post(String actionUrl, Map<String, String> params,
Map<String, File> files) throws IOException {
String BOUNDARY = java.util.UUID.randomUUID().toString();
String PREFIX = "--", LINEND = "\r\n";
String MULTIPART_FROM_DATA = "multipart/form-data";
String CHARSET = "UTF-8";
URL uri = new URL(actionUrl);
HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
conn.setReadTimeout(5 * 1000);
conn.setDoInput(true);// 允許輸入
conn.setDoOutput(true);// 允許輸出
conn.setUseCaches(false);
conn.setRequestMethod("POST"); //Post方式
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Charsert", "UTF-8");
conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA
+ ";boundary=" + BOUNDARY);
// 首先組拼文本類型的參數
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINEND);
sb.append("Content-Disposition: form-data; name=\""
+ entry.getKey() + "\"" + LINEND);
sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
sb.append(LINEND);
sb.append(entry.getValue());
sb.append(LINEND);
}
DataOutputStream outStream = new DataOutputStream(conn
.getOutputStream());
outStream.write(sb.toString().getBytes());
// 發送文件數據
if (files != null)
for (Map.Entry<String, File> file : files.entrySet()) {
StringBuilder sb1 = new StringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1
.append("Content-Disposition: form-data; name=\"file\"; filename=\""
+ file.getKey() + "\"" + LINEND);
sb1.append("Content-Type: application/octet-stream; charset="
+ CHARSET + LINEND);
sb1.append(LINEND);
outStream.write(sb1.toString().getBytes());
InputStream is = new FileInputStream(file.getValue());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
is.close();
outStream.write(LINEND.getBytes());
}
// 請求結束標志
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
outStream.write(end_data);
outStream.flush();
// 得到響應碼
int res = conn.getResponseCode();
InputStream in = conn.getInputStream();
InputStreamReader isReader = new InputStreamReader(in);
BufferedReader bufReader = new BufferedReader(isReader);
String line = null;
String data = "OK";
while((line = bufReader.readLine())==null)
data += line;
if (res == 200) {
int ch;
StringBuilder sb2 = new StringBuilder();
while ((ch = in.read()) != -1) {
sb2.append((char) ch);
}
}
outStream.close();
conn.disconnect();
return in.toString();
}
}
這個可以根據個人的需要,加上等待條等等,如果要加上等待條的話,需要使用發送消息的方式進行,這個是我所想到的,其它的方式沒有考慮好呢,有興趣的人可以自己加上去!我在這裡不再給增加了,增加的話,將在下載中添加一個下載的進度提示條。
實現內容如下:
代碼
Button btn1;
EditText view1;
EditText text1;
String SDPath = "/sdcard/";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
view1 = (EditText) findViewById(R.id.view1);
text1 = (EditText) findViewById(R.id.edit1);
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
getFile();
try {
String name=URLEncoder.encode(text1.getText().toString(),"utf-8");
Map<String, String> params = new HashMap<String, String>();
params.put("NAME", name);
Map<String, File> files = new HashMap<String, File>();
files.put(getFile(), new File("/sdcard/"+getFile()));
view1.setText(PostFile.post("http://wdsl.recordinfo.tk/default.aspx", params, files));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
String getFile() {
File file = new File(SDPath);
File[] files = file.listFiles(new fileFilter());
String filename = "";
for (File file1 : files) {
filename = file1.getName();
}
Toast.makeText(this, filename, Toast.LENGTH_LONG).show();
return filename;
}
class fileFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String filename) {
// TODO Auto-generated method stub
return filename.endsWith(".gif");
}
}
這些只是類裡面的內容,並且我只取了SD卡上的一張照片,因此我就在卡上放了一張照片,所以沒有進行列表處理,有興趣的話,可以自己添加上去,因為我主要是實現這一功能,對這一功能進行練習!
要使用SD卡和網絡,相應的權限需要加上,因為在前面已經有了,這裡將不寫贅述。
對於了解Android程序設計的人都知道,廣播是Android開發中的一個重要的功能,在Android裡面有各式各樣的廣播,比如:電池的狀態變化、信號的強弱狀態、
ListFragment繼承於Fragment。因此它具有Fragment的特性,能夠作為activity中的一部分,目的也是為了使頁面設計更加靈活。 相比Fra
關於 android 常用布局,利用 XML 文件實現已經有很多的實例了。但如何利用代碼實現呢?當然利用代碼實現沒有太大的必要,也是不提倡的,但我覺得利用代碼實現
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用