|
在现在的网络开发中,上传图片类的需求实在是太普通不过了,但是对于怎么样做到上传图片,对于刚开始建立项目的时候,还是有点不知所措的。也许有幸,我们做的项目是之前已经有人写过类似的用例了,那么我们只需要依葫芦画瓢就行了。
好好了解下图片上传(文件上传)的方式,对于认知的提升还是有好处的。而且说不定哪天你就有个这样的需求呢,这里是一条龙上传。
本文就一个从app到php层,再到java层的流程,演译下整个上传图片的流程吧。
一、app端获取用户选择的图片,转化为输入流,上传至php前端接口:
<span style="color: #0000ff">import<span style="color: #000000"> java.io.DataOutputStream;
<span style="color: #0000ff">import<span style="color: #000000"> java.io.File;
<span style="color: #0000ff">import<span style="color: #000000"> java.io.FileInputStream;
<span style="color: #0000ff">import<span style="color: #000000"> java.io.IOException;
<span style="color: #0000ff">import<span style="color: #000000"> java.io.InputStream;
<span style="color: #0000ff">import<span style="color: #000000"> java.net.HttpURLConnection;
<span style="color: #0000ff">import<span style="color: #000000"> java.net.MalformedURLException;
<span style="color: #0000ff">import<span style="color: #000000"> java.net.URL;
<span style="color: #0000ff">import<span style="color: #000000"> java.util.HashMap;
<span style="color: #0000ff">import<span style="color: #000000"> java.util.Map;
<span style="color: #0000ff">import<span style="color: #000000"> java.util.UUID;
<span style="color: #008000">/**<span style="color: #008000">
- 上传文件到服务器类
<span style="color: #008000">/
<span style="color: #0000ff">public <span style="color: #0000ff">class<span style="color: #000000"> UploadUtil {
<span style="color: #0000ff">private <span style="color: #0000ff">static <span style="color: #0000ff">final String TAG = "uploadFile"<span style="color: #000000">;
<span style="color: #0000ff">private <span style="color: #0000ff">static <span style="color: #0000ff">final <span style="color: #0000ff">int TIME_OUT = 10 1000; <span style="color: #008000">//<span style="color: #008000"> 超时时间
<span style="color: #0000ff">private <span style="color: #0000ff">static <span style="color: #0000ff">final String CHARSET = "utf-8"; <span style="color: #008000">//<span style="color: #008000"> 设置编码
<span style="color: #008000">/**<span style="color: #008000">
- Android上传文件到服务端
-
- <span style="color: #808080">@param<span style="color: #008000"> file 需要上传的文件
- <span style="color: #808080">@param<span style="color: #008000"> RequestURL 请求的rul
- <span style="color: #808080">@return<span style="color: #008000"> 返回响应的内容
<span style="color: #008000">*/
<span style="color: #0000ff">public <span style="color: #0000ff">static<span style="color: #000000"> String uploadFile(File file,String RequestURL) {
String result = <span style="color: #0000ff">null<span style="color: #000000">;
String BOUNDARY = UUID.randomUUID().toString(); <span style="color: #008000">//<span style="color: #008000"> 边界标识 随机生成
String PREFIX = "--",LINE_END = "rn"<span style="color: #000000">;
String CONTENT_TYPE = "multipart/form-data"; <span style="color: #008000">//<span style="color: #008000"> 内容类型
<span style="color: #0000ff">try<span style="color: #000000"> {
URL url = <span style="color: #0000ff">new<span style="color: #000000"> URL(RequestURL);
HttpURLConnection conn =<span style="color: #000000"> (HttpURLConnection) url.openConnection();
conn.setReadTimeout(TIME_OUT);
conn.setConnectTimeout(TIME_OUT);
conn.setDoInput(<span style="color: #0000ff">true); <span style="color: #008000">//<span style="color: #008000"> 允许输入流
conn.setDoOutput(<span style="color: #0000ff">true); <span style="color: #008000">//<span style="color: #008000"> 允许输出流
conn.setUseCaches(<span style="color: #0000ff">false); <span style="color: #008000">//<span style="color: #008000"> 不允许使用缓存
conn.setRequestMethod("POST"); <span style="color: #008000">//<span style="color: #008000"> 请求方式
conn.setRequestProperty("Charset",CHARSET); <span style="color: #008000">//<span style="color: #008000"> 设置编码
conn.setRequestProperty("connection","keep-alive"<span style="color: #000000">);
conn.setRequestProperty("Content-Type",CONTENT_TYPE + ";boundary=" +<span style="color: #000000"> BOUNDARY);
<span style="color: #0000ff">if (file != <span style="color: #0000ff">null<span style="color: #000000">) {
DataOutputStream dos = <span style="color: #0000ff">new<span style="color: #000000"> DataOutputStream(conn.getOutputStream());
StringBuffer sb = <span style="color: #0000ff">new<span style="color: #000000"> StringBuffer();
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINE_END);
<span style="color: #008000">/**<span style="color: #008000">
- 这里重点注意: name里面的值为服务端需要key 只有这个key 才可以得到对应的文件
- filename是文件的名字,包含后缀名的 比如:abc.png
<span style="color: #008000">*/<span style="color: #000000">
sb.append("Content-Disposition: form-data; name="uploadfile"; filename=""
- file.getName() + """ +<span style="color: #000000"> LINE_END);
sb.append("Content-Type: application/octet-stream; charset=" + CHARSET +<span style="color: #000000"> LINE_END);
sb.append(LINE_END);
dos.write(sb.toString().getBytes());
InputStream is = <span style="color: #0000ff">new<span style="color: #000000"> FileInputStream(file);
<span style="color: #0000ff">byte[] bytes = <span style="color: #0000ff">new <span style="color: #0000ff">byte[1024<span style="color: #000000">];
<span style="color: #0000ff">int len = 0<span style="color: #000000">;
<span style="color: #0000ff">while ((len = is.read(bytes)) != -1<span style="color: #000000">) {
dos.write(bytes,0<span style="color: #000000">,len);
}
is.close();
dos.write(LINE_END.getBytes());
<span style="color: #0000ff">byte[] end_data = (PREFIX + BOUNDARY + PREFIX +<span style="color: #000000"> LINE_END).getBytes();
dos.write(end_data);
dos.flush();
InputStream input =<span style="color: #000000"> conn.getInputStream();
StringBuffer sb1 = <span style="color: #0000ff">new<span style="color: #000000"> StringBuffer();
<span style="color: #0000ff">int<span style="color: #000000"> ss;
<span style="color: #0000ff">while ((ss = input.read()) != -1<span style="color: #000000">) {
sb1.append((<span style="color: #0000ff">char<span style="color: #000000">) ss);
}
result =<span style="color: #000000"> sb1.toString();
}
} <span style="color: #0000ff">catch<span style="color: #000000"> (MalformedURLException e) {
e.printStackTrace();
} <span style="color: #0000ff">catch<span style="color: #000000"> (IOException e) {
e.printStackTrace();
}
<span style="color: #0000ff">return<span style="color: #000000"> result;
}
<span style="color: #008000">/**<span style="color: #008000">
- 通过拼接的方式构造请求内容,实现参数传输以及文件传输
-
- <span style="color: #808080">@param<span style="color: #008000"> url Service net address
- <span style="color: #808080">@param<span style="color: #008000"> params text content
- <span style="color: #808080">@param<span style="color: #008000"> files pictures
- <span style="color: #808080">@return<span style="color: #008000"> String result of Service response
- <span style="color: #808080">@throws<span style="color: #008000"> IOException
<span style="color: #008000">/
<span style="color: #0000ff">public <span style="color: #0000ff">static String post(String url,Map<String,String> params,File><span style="color: #000000"> files)
<span style="color: #0000ff">throws<span style="color: #000000"> IOException {
String BOUNDARY =<span style="color: #000000"> UUID.randomUUID().toString();
String PREFIX = "--",LINEND = "rn"<span style="color: #000000">;
String MULTIPART_FROM_DATA = "multipart/form-data"<span style="color: #000000">;
String CHARSET = "UTF-8"<span style="color: #000000">;
URL uri = <span style="color: #0000ff">new<span style="color: #000000"> URL(url);
HttpURLConnection conn =<span style="color: #000000"> (HttpURLConnection) uri.openConnection();
conn.setReadTimeout(10 1000); <span style="color: #008000">//<span style="color: #008000"> 缓存的最长时间
conn.setDoInput(<span style="color: #0000ff">true); <span style="color: #008000">//<span style="color: #008000"> 允许输入
conn.setDoOutput(<span style="color: #0000ff">true); <span style="color: #008000">//<span style="color: #008000"> 允许输出
conn.setUseCaches(<span style="color: #0000ff">false); <span style="color: #008000">//<span style="color: #008000"> 不允许使用缓存
conn.setRequestMethod("POST"<span style="color: #000000">);
conn.setRequestProperty("connection","keep-alive"<span style="color: #000000">);
conn.setRequestProperty("Charsert","UTF-8"<span style="color: #000000">);
conn.setRequestProperty("Content-Type",MULTIPART_FROM_DATA + ";boundary=" +<span style="color: #000000"> BOUNDARY);
<span style="color: #008000">//<span style="color: #008000"> 首先组拼文本类型的参数
StringBuilder sb = <span style="color: #0000ff">new<span style="color: #000000"> StringBuilder();
<span style="color: #0000ff">for (Map.Entry<String,String><span style="color: #000000"> entry : params.entrySet()) {
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINEND);
sb.append("Content-Disposition: form-data; name="" + entry.getKey() + """ +<span style="color: #000000"> LINEND);
sb.append("Content-Type: text/plain; charset=" + CHARSET +<span style="color: #000000"> LINEND);
sb.append("Content-Transfer-Encoding: 8bit" +<span style="color: #000000"> LINEND);
sb.append(LINEND);
sb.append(entry.getValue());
sb.append(LINEND);
}
DataOutputStream outStream = <span style="color: #0000ff">new<span style="color: #000000"> DataOutputStream(conn.getOutputStream());
outStream.write(sb.toString().getBytes());
<span style="color: #008000">//<span style="color: #008000"> 发送文件数据
<span style="color: #0000ff">if (files != <span style="color: #0000ff">null<span style="color: #000000">)
<span style="color: #0000ff">for (Map.Entry<String,File><span style="color: #000000"> file : files.entrySet()) {
StringBuilder sb1 = <span style="color: #0000ff">new<span style="color: #000000"> StringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1.append("Content-Disposition: form-data; name="uploadfile"; filename=""
<span style="color: #0000ff">use<span style="color: #000000"> ActionRestAction;
<span style="color: #0000ff">use<span style="color: #000000"> ApiUploadApi;
(编辑:安卓应用网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|