Android Httpはファイルのアップロードとダウンロードを実現します。
7748 ワード
最近のプロジェクトでは、ファイルのアップロードとダウンロードの機能については、みんなが知っていますが、この機能は実際にはすでに壊れています。そして、直接にネットでコードをいっぱい使いました。もっと多くの人が利用されますように。
ファイルアップロード
org.apache.com mmons.httpclient.Http Clientを通じてファイルのアップロードを実現します。
•PostMethodのget Request CharSetを複写し、要求符号化を指定します。
HttpURLConnectionを通じてファイルをダウンロードします。
Input streamを読み込み、SDCardに書き込みます。
第二の方法を紹介します。データの紛失を防ぐためです。ファイルコードは以下の通りです。
以上は私が整理したAndroid Httpファイルのアップロードとダウンロード方法です。
ファイルアップロード
org.apache.com mmons.httpclient.Http Clientを通じてファイルのアップロードを実現します。
/**
* @param mContext
* @param targetUrl
* @param filePath
*/
public void uploadFile(final Activity mContext, String targetUrl, final String filePath) {
System.out.println("targetUrl: " + targetUrl + " filePath: " + filePath);
if (TextUtils.isEmpty(filePath)) {
Toast.makeText(mContext, " ", Toast.LENGTH_SHORT).show();
return;
}
final PostMethod filePost = new PostMethod(targetUrl) {//
public String getRequestCharSet() {
return "UTF-8";
}
};
try {
final HttpClient client = new HttpClient();
File file = new File(filePath);
if (file.exists() && file.isFile()) {
long fileSize = file.length();
if (fileSize >= 5 * 1024 * 1024) {
Toast.makeText(mContext, " 5M", Toast.LENGTH_SHORT).show();
return;
}
} else {
Toast.makeText(mContext, " ", Toast.LENGTH_SHORT).show();
return;
}
//
Part[] parts = new Part[]{new CustomFilePart(file.getName(), file),
new StringPart("filename", file.getName(), "UTF-8")};
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
new Thread(new Runnable() {
@Override
public void run() {
int statuscode = 0;
try {
statuscode = client.executeMethod(filePost);
} catch (IOException e) {
e.printStackTrace();
}
final int finalStatuscode = statuscode;
mContext.runOnUiThread(new Runnable() {
@Override
public void run() {
if (finalStatuscode == HttpStatus.SC_OK) {
Toast.makeText(mContext, " ", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, " ", Toast.LENGTH_SHORT).show();
}
}
});
}
}).start();
} catch (Exception ex) {
ex.printStackTrace();
}
}
Http Clientの使用は、しばしば文字化けの問題に遭遇します。私たちは主に二つのところで文字化けの問題を解決します。•PostMethodのget Request CharSetを複写し、要求符号化を指定します。
final PostMethod filePost = new PostMethod(targetUrl) {//
public String getRequestCharSet() {
return "UTF-8";
}
};
•カスタムFilePart、指定要求パラメータ符号化
/**
*
*/
public class CustomFilePart extends FilePart {
public CustomFilePart(String filename, File file)
throws FileNotFoundException {
super(filename, file);
}
protected void sendDispositionHeader(OutputStream out) throws IOException {
super.sendDispositionHeader(out);
String filename = getSource().getFileName();
if (filename != null) {
out.write(EncodingUtil.getAsciiBytes(FILE_NAME));
out.write(QUOTE_BYTES);
out.write(EncodingUtil.getBytes(filename, "UTF-8"));
out.write(QUOTE_BYTES);
}
}
}
Custoom FilePartを使用してパラメータを追加します。
Part[] parts = new Part[]{new CustomFilePart(file.getName(), file),
new StringPart("filename", file.getName(), "UTF-8")};
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
ファイルのダウンロードHttpURLConnectionを通じてファイルをダウンロードします。
/**
* @param urlStr
* @param path
* @param fileName
* @return
*/
public String downFile(String urlStr, String path, String fileName) {
InputStream inputStream = null;
String filePath = null;
try {
FileUtils fileUtils = new FileUtils();
//
if (fileUtils.isFileExist(path + fileName)) {
System.out.println("exits");
filePath = SDPATH + path + fileName;
} else {
// io
inputStream = getInputStreamFromURL(urlStr);
// input SD
File resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream);
if (resultFile != null) {
filePath = resultFile.getPath();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (inputStream != null)
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return filePath;
}
/**
* URL
*
* @param urlStr
* @return
*/
public InputStream getInputStreamFromURL(String urlStr) {
HttpURLConnection urlConn;
InputStream inputStream = null;
try {
url = new URL(urlStr);
urlConn = (HttpURLConnection) url.openConnection();
inputStream = urlConn.getInputStream();
} catch (Exception e) {
e.printStackTrace();
}
return inputStream;
}
ファイルのダウンロードは簡単です。つまりHTTPでInputStreamを取得し、InputStreamを解析してファイルに書き込むだけです。Input streamを読み込み、SDCardに書き込みます。
/**
* InputStream SD
*
* @param path
* @param fileName
* @param input
* @return
*/
public File write2SDFromInput(String path, String fileName,
InputStream input) {
File file = null;
OutputStream output = null;
try {
//
createSDDir(path);
//
file = createSDFile(path + fileName);
// ,
output = new FileOutputStream(file);
//
byte[] buffer = new byte[FILESIZE];
int count;
while ((count = input.read(buffer)) != -1) {
// , , ,
output.write(buffer, 0, count);
}
output.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
output.close();
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return file;
}
Inputstreamをsdcardカードに書き込みます。重要なところがあります。まずOutputStreamのwrite方法を見てください。第二の方法を紹介します。データの紛失を防ぐためです。ファイルコードは以下の通りです。
while ((count = input.read(buffer)) != -1) {
// , , ,
output.write(buffer, 0, count);
}
ソースの住所:https://github.com/zuiwuyuan/Http_Uploader_Downloader以上は私が整理したAndroid Httpファイルのアップロードとダウンロード方法です。