如何使用http或httpClient向服务器上传图片 以及使用http上传图片时协议的描述
2016-12-26 13:47
811 查看
向服务器上传图片的实例:
在Java web中上传图片相对比较容易,只需简单几个按钮和应用即可,以下的例子是如何使用http或httpClient向本地服务器上传图片。
1.网页版
在本地创建一个Java web项目并上传图片到本地服务器。服务器版本须为3.0,一般Tomcat7.0以上。
创建web项目 uploadImage,在 webContent目录下创建index.jsp,body中的代码为:
[java] view
plain copy
<form action="Uploadimage" method="post" enctype="multipart/form-data">
<input type="file" name="file"><br>
<input type="submit" value="submit">
</form>
指定数据类型:enctype="multipart/form-data",使用multipart/form-data最后数据会以二进制形式提交给服务器,字符不需要编码不会对服务端的获取有影响。
表单中enctype类型默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传。
具体请参考:http://blog.csdn.NET/MSPinyin/article/details/6141638
创建一个servlet:Uploadimage.jave,需要注意的是在Uploadimage类的上方中需要再添加一个注解标签来指定文件保存的路径,不然会在添加文件上传时报空指针异常。
注解标签为:@MultipartConfig(location="E://"),以下是添加地方。
[java] view
plain copy
@WebServlet("/Uploadimage")
@MultipartConfig(location="E://")
public class Uploadimage extends HttpServlet {
添加完标签以后在doGet方法中调用doPost方法,在doPost方法中写入以下代码:
[java] view
plain copy
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将当前系统时间作为文件的名称避免重名
//Date data=new Date();
SimpleDateFormat adf=new SimpleDateFormat("HHmmss");
String filename=adf.format(new Date());
Part part=request.getPart("file");//获取文件路径
part.write(filename+".jpg");
response.setCharacterEncoding("UTF-8");
PrintWriter out=response.getWriter();
out.print("success!");
System.out.print("上传成功!");
}
注意,Part,引入的包为:
[java] view
plain copy
import javax.servlet.http.Part;
完成以上以后,将web项目运行在服务器上。在web页面选择图片并点击上传,会在你的E盘上生成一个以时间为命名的jsp图片。
至此,通过java web上传图片的例子结束,以下是如何在Android客户端通过http上传图片。
2.通过http从Android客户端上传图片,在这之前,需要先了解在网页上是如何通过multipart/form-data来传输数据的。
打开浏览器,在地址栏输入我们以上网页版的web项目地址:http://localhost:8080/uploadImage,在浏览器:工具----》开发者工具---》网络---》启用网络流量捕获
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/26/0d0904958d9ebdbc5670556f81d5b1a2)
,然后选择文件,提交。
回到开发者工具后会检测到一个刚提交的数据:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/26/665f293ed9b5c0cf8a239a5775f45d91)
双击打开,会在content-type看到一个编节符的请求头文件信息,点击上方的请求正文,将会看到以下内容,这个内容也将是待会使用http进行图片上传时需要转化数据格式。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/26/51f964cfeb885133e05e1ad8937d7a94)
需要指出的是,由于浏览器的原因,以上的编节符前面并不是一条直线,而是虚线:
-----------------------------7e020233150564,这个一般由系统随机产生,且开头增加了两个"-",减去这两个”-“就是一个"boundary",boundary这待会会用到的。
Content-Type:image/jpeg 就是文件的 类型。
<二进制文件数据未显示>:这一部分就是上传的图片。
以上的就是通过这样的协议向服务器发送数据。客户端向服务器发送数据时也需要遵守这样的协议。
了解了上传的协议描述后,接下来将是进行代码:
创建项目UploadImageDome,并创建UploadThread.java 类,让该类继承Thread:
创建方法:httpUpload();//该方法中写的是通过http方式上传图片,代码为:
[java] view
plain copy
public void httpUpload(){
String boundary="-------------------------7e020233150564";//编节符
String prefix="--";//前缀 上传时需要多出两个-- 一定需要注意!!!
String end="\r\n";//这里也需要注意,在html协议中,用 “/r/n” 换行,而不是 “/n”。
SimpleDateFormat adf=new SimpleDateFormat("HHmmss");//通过时间来创建文件名
String uploadname=adf.format(new Date())+".jsp";//上传的文件名称
try {
URL http=new URL(murl);
HttpURLConnection conn= (HttpURLConnection) http.openConnection();
conn.setRequestMethod("POST");
conn.setReadTimeout(5000);
conn.setDoInput(true);//准许向服务器读数据
conn.setDoOutput(true);//准许向服务器写入数据
/*设置向服务器上传数据的请求方式 默认的是表单形式
* 通过Content-Type协议向服务器上传数据
* boundary
* */
conn.setRequestProperty("Content-Type","multipart/form-data;boundary="+boundary);
//创建一个输出流对象,
DataOutputStream out=new DataOutputStream(conn.getOutputStream());
/*
*
-----------------------------7e020233150564
Content-Disposition: form-data; name="file"; filename="I:\迅雷下载\18fb1f51c9eb63489cce9e029154782e.jpg"
Content-Type: image/jpeg
//这里是空一行 需要注意
<二进制文件数据未显示>
---------------------------7e020233150564--
*/
//向服务器写入数据 这里就需要完全根据以上协议格式来写,需要仔细,避免出错。
out.writeBytes(prefix+boundary+end);//这是第一行 并回车换行
//这是第二行,文件名和对应服务器的
out.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""+uploadname+"\""+end);//这是第二行
out.writeBytes(end);//空一行
//以下写入图片
FileInputStream fileInputStream=new FileInputStream(new File(mfilename));
byte[]b=new byte[1024*4];//缓冲区
int len;
//循环读数据
while((len=fileInputStream.read(b))!=-1){
out.write(b, 0, len);
}
//写完数据后 回车换行
out.writeBytes(end);
out.writeBytes(prefix + boundary + prefix + end);
out.flush();//清空
//创建一个输入流对象 获取返回的信息 是否上传成功
BufferedReader reader=new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sb=new StringBuffer();
String str;
while((str=reader.readLine())!=null){
sb.append(str);
}
//关闭流信息
if(out!=null)out.close();
if(reader!=null)reader.close();
System.out.print("返回结果:"+sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
在run()方法中调用该httpUpload()方法。
MainActivity.java类,代码为:
[java] view
plain copy
</pre><pre name="code" class="java">import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.io.File;
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url="http://125.217.54.155:8080/uploadImage/Uploadimage";
/***获取文件路径 在这部分可以设置为跳转到你的相册选取 暂时写死 以后加上***/
File file= Environment.getExternalStorageDirectory();//获取文件路径
File fileupload=new File(file,"zxy.jpg");//在SD卡里需要有这个图片 不然会获取不到
String name=fileupload.getAbsolutePath();//获取到该图片的绝对路径
UploadImageThread thread=new UploadImageThread(url,name);
thread.start();
}
});
}
}
记得加上联网权限和读取SD卡权限:
[java] view
plain copy
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
运行的结果会在E盘中生成一个图片文件:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/26/b7ad7acf2b9e80052573c2057bc95ddc)
3.以上是使用http的方式,这个方式需要谨慎的遵循协议格式,较容易出错,以下使用httpClient第三发库来上传 这种方式比较容易,但是在新版的sdk中,Google已经将该类剔除,需要使用的话:
eclipse里的话,在libs里添加org.apache.http.legacy.jar包
android studio的话里在相应的module下的build.gradle中的
android {
加入:useLibrary 'org.apache.http.legacy'
}
且需要引入两个jar包为:httpcore-4.4.1和httpmine-4.5,后面的数字为版本号,不建议使太高的版本,否则编译不通过。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/26/de92f12865edece374a67c86354e7d6a)
在uploadHttpClient()写入以下代码:
[java] view
plain copy
/**
* 使用HttpClient来上传数据
*/
public void uploadHttpClient(){
HttpClient client=new DefaultHttpClient();
HttpPost httpPost=new HttpPost(murl);//通过post传递
/**绑定数据 这里需要注意 如果是中文 会出现中文乱码问题 但只要按设置好*/
MultipartEntity muit=new MultipartEntity();
// 上传 文本, 转换编码为utf-8 其中"text" 为字段名,
//Charset.forName(CHARSET)为参数值,可设置为UTF-8,其实就是正常的值转换成utf-8的编码格式
// 后边new StringBody(text,Charset.forName(CHARSET))
File parent= Environment.getExternalStorageDirectory();//路径
File fileupload=new File(parent,"zxy.jpg");
FileBody fileBody=new FileBody(fileupload);
muit.addPart("file",fileBody);
httpPost.setEntity(muit);
/**发送请求*/
try {
HttpResponse response=client.execute(httpPost);
//判断师傅上传成功 返回200
if (response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
System.out.println(EntityUtils.toString(response.getEntity()));
}
} catch (ClientProtocolException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
完成后在run()方法中调用uploadHttpClient()。
[java] view
plain copy
@Override
public void run() {
// httpUpload();
uploadHttpClient();
}
![](https://oscdn.geek-share.com/Uploads/Images/Content/201701/9cc493f1e15b23d0f4eaea0d0f8b35d0.png)
运行结果跟http方法一样,不赘述。至此,三个方法已经全部结束。所需jar可自行下载。
以下是参考的博客:
http://blog.csdn href="http://lib.csdn.net/base/dotnet" target=_blank>.Net/linwei_1029/article/details/6990971
http://blog.csdn.net/MSPinyin/article/details/6141638
向服务器上传图片的实例:
在Java web中上传图片相对比较容易,只需简单几个按钮和应用即可,以下的例子是如何使用http或httpClient向本地服务器上传图片。
1.网页版
在本地创建一个Java web项目并上传图片到本地服务器。服务器版本须为3.0,一般Tomcat7.0以上。
创建web项目 uploadImage,在 webContent目录下创建index.jsp,body中的代码为:
[java] view
plain copy
<form action="Uploadimage" method="post" enctype="multipart/form-data">
<input type="file" name="file"><br>
<input type="submit" value="submit">
</form>
指定数据类型:enctype="multipart/form-data",使用multipart/form-data最后数据会以二进制形式提交给服务器,字符不需要编码不会对服务端的获取有影响。
表单中enctype类型默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传。
具体请参考:http://blog.csdn.NET/MSPinyin/article/details/6141638
创建一个servlet:Uploadimage.jave,需要注意的是在Uploadimage类的上方中需要再添加一个注解标签来指定文件保存的路径,不然会在添加文件上传时报空指针异常。
注解标签为:@MultipartConfig(location="E://"),以下是添加地方。
[java] view
plain copy
@WebServlet("/Uploadimage")
@MultipartConfig(location="E://")
public class Uploadimage extends HttpServlet {
添加完标签以后在doGet方法中调用doPost方法,在doPost方法中写入以下代码:
[java] view
plain copy
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将当前系统时间作为文件的名称避免重名
//Date data=new Date();
SimpleDateFormat adf=new SimpleDateFormat("HHmmss");
String filename=adf.format(new Date());
Part part=request.getPart("file");//获取文件路径
part.write(filename+".jpg");
response.setCharacterEncoding("UTF-8");
PrintWriter out=response.getWriter();
out.print("success!");
System.out.print("上传成功!");
}
注意,Part,引入的包为:
[java] view
plain copy
import javax.servlet.http.Part;
完成以上以后,将web项目运行在服务器上。在web页面选择图片并点击上传,会在你的E盘上生成一个以时间为命名的jsp图片。
至此,通过java web上传图片的例子结束,以下是如何在Android客户端通过http上传图片。
2.通过http从Android客户端上传图片,在这之前,需要先了解在网页上是如何通过multipart/form-data来传输数据的。
打开浏览器,在地址栏输入我们以上网页版的web项目地址:http://localhost:8080/uploadImage,在浏览器:工具----》开发者工具---》网络---》启用网络流量捕获
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/26/0d0904958d9ebdbc5670556f81d5b1a2)
,然后选择文件,提交。
回到开发者工具后会检测到一个刚提交的数据:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/26/665f293ed9b5c0cf8a239a5775f45d91)
双击打开,会在content-type看到一个编节符的请求头文件信息,点击上方的请求正文,将会看到以下内容,这个内容也将是待会使用http进行图片上传时需要转化数据格式。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/26/51f964cfeb885133e05e1ad8937d7a94)
需要指出的是,由于浏览器的原因,以上的编节符前面并不是一条直线,而是虚线:
-----------------------------7e020233150564,这个一般由系统随机产生,且开头增加了两个"-",减去这两个”-“就是一个"boundary",boundary这待会会用到的。
Content-Type:image/jpeg 就是文件的 类型。
<二进制文件数据未显示>:这一部分就是上传的图片。
以上的就是通过这样的协议向服务器发送数据。客户端向服务器发送数据时也需要遵守这样的协议。
了解了上传的协议描述后,接下来将是进行代码:
创建项目UploadImageDome,并创建UploadThread.java 类,让该类继承Thread:
创建方法:httpUpload();//该方法中写的是通过http方式上传图片,代码为:
[java] view
plain copy
public void httpUpload(){
String boundary="-------------------------7e020233150564";//编节符
String prefix="--";//前缀 上传时需要多出两个-- 一定需要注意!!!
String end="\r\n";//这里也需要注意,在html协议中,用 “/r/n” 换行,而不是 “/n”。
SimpleDateFormat adf=new SimpleDateFormat("HHmmss");//通过时间来创建文件名
String uploadname=adf.format(new Date())+".jsp";//上传的文件名称
try {
URL http=new URL(murl);
HttpURLConnection conn= (HttpURLConnection) http.openConnection();
conn.setRequestMethod("POST");
conn.setReadTimeout(5000);
conn.setDoInput(true);//准许向服务器读数据
conn.setDoOutput(true);//准许向服务器写入数据
/*设置向服务器上传数据的请求方式 默认的是表单形式
* 通过Content-Type协议向服务器上传数据
* boundary
* */
conn.setRequestProperty("Content-Type","multipart/form-data;boundary="+boundary);
//创建一个输出流对象,
DataOutputStream out=new DataOutputStream(conn.getOutputStream());
/*
*
-----------------------------7e020233150564
Content-Disposition: form-data; name="file"; filename="I:\迅雷下载\18fb1f51c9eb63489cce9e029154782e.jpg"
Content-Type: image/jpeg
//这里是空一行 需要注意
<二进制文件数据未显示>
---------------------------7e020233150564--
*/
//向服务器写入数据 这里就需要完全根据以上协议格式来写,需要仔细,避免出错。
out.writeBytes(prefix+boundary+end);//这是第一行 并回车换行
//这是第二行,文件名和对应服务器的
out.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""+uploadname+"\""+end);//这是第二行
out.writeBytes(end);//空一行
//以下写入图片
FileInputStream fileInputStream=new FileInputStream(new File(mfilename));
byte[]b=new byte[1024*4];//缓冲区
int len;
//循环读数据
while((len=fileInputStream.read(b))!=-1){
out.write(b, 0, len);
}
//写完数据后 回车换行
out.writeBytes(end);
out.writeBytes(prefix + boundary + prefix + end);
out.flush();//清空
//创建一个输入流对象 获取返回的信息 是否上传成功
BufferedReader reader=new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sb=new StringBuffer();
String str;
while((str=reader.readLine())!=null){
sb.append(str);
}
//关闭流信息
if(out!=null)out.close();
if(reader!=null)reader.close();
System.out.print("返回结果:"+sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
在run()方法中调用该httpUpload()方法。
MainActivity.java类,代码为:
[java] view
plain copy
</pre><pre name="code" class="java">import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.io.File;
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url="http://125.217.54.155:8080/uploadImage/Uploadimage";
/***获取文件路径 在这部分可以设置为跳转到你的相册选取 暂时写死 以后加上***/
File file= Environment.getExternalStorageDirectory();//获取文件路径
File fileupload=new File(file,"zxy.jpg");//在SD卡里需要有这个图片 不然会获取不到
String name=fileupload.getAbsolutePath();//获取到该图片的绝对路径
UploadImageThread thread=new UploadImageThread(url,name);
thread.start();
}
});
}
}
记得加上联网权限和读取SD卡权限:
[java] view
plain copy
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
运行的结果会在E盘中生成一个图片文件:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/26/b7ad7acf2b9e80052573c2057bc95ddc)
3.以上是使用http的方式,这个方式需要谨慎的遵循协议格式,较容易出错,以下使用httpClient第三发库来上传 这种方式比较容易,但是在新版的sdk中,Google已经将该类剔除,需要使用的话:
eclipse里的话,在libs里添加org.apache.http.legacy.jar包
android studio的话里在相应的module下的build.gradle中的
android {
加入:useLibrary 'org.apache.http.legacy'
}
且需要引入两个jar包为:httpcore-4.4.1和httpmine-4.5,后面的数字为版本号,不建议使太高的版本,否则编译不通过。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/26/de92f12865edece374a67c86354e7d6a)
在uploadHttpClient()写入以下代码:
[java] view
plain copy
/**
* 使用HttpClient来上传数据
*/
public void uploadHttpClient(){
HttpClient client=new DefaultHttpClient();
HttpPost httpPost=new HttpPost(murl);//通过post传递
/**绑定数据 这里需要注意 如果是中文 会出现中文乱码问题 但只要按设置好*/
MultipartEntity muit=new MultipartEntity();
// 上传 文本, 转换编码为utf-8 其中"text" 为字段名,
//Charset.forName(CHARSET)为参数值,可设置为UTF-8,其实就是正常的值转换成utf-8的编码格式
// 后边new StringBody(text,Charset.forName(CHARSET))
File parent= Environment.getExternalStorageDirectory();//路径
File fileupload=new File(parent,"zxy.jpg");
FileBody fileBody=new FileBody(fileupload);
muit.addPart("file",fileBody);
httpPost.setEntity(muit);
/**发送请求*/
try {
HttpResponse response=client.execute(httpPost);
//判断师傅上传成功 返回200
if (response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
System.out.println(EntityUtils.toString(response.getEntity()));
}
} catch (ClientProtocolException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
完成后在run()方法中调用uploadHttpClient()。
[java] view
plain copy
@Override
public void run() {
// httpUpload();
uploadHttpClient();
}
![](https://oscdn.geek-share.com/Uploads/Images/Content/201701/9cc493f1e15b23d0f4eaea0d0f8b35d0.png)
运行结果跟http方法一样,不赘述。至此,三个方法已经全部结束。所需jar可自行下载。
以下是参考的博客:
http://blog.csdn href="http://lib.csdn.net/base/dotnet" target=_blank>.Net/linwei_1029/article/details/6990971
http://blog.csdn.net/MSPinyin/article/details/6141638
在Java web中上传图片相对比较容易,只需简单几个按钮和应用即可,以下的例子是如何使用http或httpClient向本地服务器上传图片。
1.网页版
在本地创建一个Java web项目并上传图片到本地服务器。服务器版本须为3.0,一般Tomcat7.0以上。
创建web项目 uploadImage,在 webContent目录下创建index.jsp,body中的代码为:
[java] view
plain copy
<form action="Uploadimage" method="post" enctype="multipart/form-data">
<input type="file" name="file"><br>
<input type="submit" value="submit">
</form>
指定数据类型:enctype="multipart/form-data",使用multipart/form-data最后数据会以二进制形式提交给服务器,字符不需要编码不会对服务端的获取有影响。
表单中enctype类型默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传。
具体请参考:http://blog.csdn.NET/MSPinyin/article/details/6141638
创建一个servlet:Uploadimage.jave,需要注意的是在Uploadimage类的上方中需要再添加一个注解标签来指定文件保存的路径,不然会在添加文件上传时报空指针异常。
注解标签为:@MultipartConfig(location="E://"),以下是添加地方。
[java] view
plain copy
@WebServlet("/Uploadimage")
@MultipartConfig(location="E://")
public class Uploadimage extends HttpServlet {
添加完标签以后在doGet方法中调用doPost方法,在doPost方法中写入以下代码:
[java] view
plain copy
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将当前系统时间作为文件的名称避免重名
//Date data=new Date();
SimpleDateFormat adf=new SimpleDateFormat("HHmmss");
String filename=adf.format(new Date());
Part part=request.getPart("file");//获取文件路径
part.write(filename+".jpg");
response.setCharacterEncoding("UTF-8");
PrintWriter out=response.getWriter();
out.print("success!");
System.out.print("上传成功!");
}
注意,Part,引入的包为:
[java] view
plain copy
import javax.servlet.http.Part;
完成以上以后,将web项目运行在服务器上。在web页面选择图片并点击上传,会在你的E盘上生成一个以时间为命名的jsp图片。
至此,通过java web上传图片的例子结束,以下是如何在Android客户端通过http上传图片。
2.通过http从Android客户端上传图片,在这之前,需要先了解在网页上是如何通过multipart/form-data来传输数据的。
打开浏览器,在地址栏输入我们以上网页版的web项目地址:http://localhost:8080/uploadImage,在浏览器:工具----》开发者工具---》网络---》启用网络流量捕获
,然后选择文件,提交。
回到开发者工具后会检测到一个刚提交的数据:
双击打开,会在content-type看到一个编节符的请求头文件信息,点击上方的请求正文,将会看到以下内容,这个内容也将是待会使用http进行图片上传时需要转化数据格式。
需要指出的是,由于浏览器的原因,以上的编节符前面并不是一条直线,而是虚线:
-----------------------------7e020233150564,这个一般由系统随机产生,且开头增加了两个"-",减去这两个”-“就是一个"boundary",boundary这待会会用到的。
Content-Type:image/jpeg 就是文件的 类型。
<二进制文件数据未显示>:这一部分就是上传的图片。
以上的就是通过这样的协议向服务器发送数据。客户端向服务器发送数据时也需要遵守这样的协议。
了解了上传的协议描述后,接下来将是进行代码:
创建项目UploadImageDome,并创建UploadThread.java 类,让该类继承Thread:
创建方法:httpUpload();//该方法中写的是通过http方式上传图片,代码为:
[java] view
plain copy
public void httpUpload(){
String boundary="-------------------------7e020233150564";//编节符
String prefix="--";//前缀 上传时需要多出两个-- 一定需要注意!!!
String end="\r\n";//这里也需要注意,在html协议中,用 “/r/n” 换行,而不是 “/n”。
SimpleDateFormat adf=new SimpleDateFormat("HHmmss");//通过时间来创建文件名
String uploadname=adf.format(new Date())+".jsp";//上传的文件名称
try {
URL http=new URL(murl);
HttpURLConnection conn= (HttpURLConnection) http.openConnection();
conn.setRequestMethod("POST");
conn.setReadTimeout(5000);
conn.setDoInput(true);//准许向服务器读数据
conn.setDoOutput(true);//准许向服务器写入数据
/*设置向服务器上传数据的请求方式 默认的是表单形式
* 通过Content-Type协议向服务器上传数据
* boundary
* */
conn.setRequestProperty("Content-Type","multipart/form-data;boundary="+boundary);
//创建一个输出流对象,
DataOutputStream out=new DataOutputStream(conn.getOutputStream());
/*
*
-----------------------------7e020233150564
Content-Disposition: form-data; name="file"; filename="I:\迅雷下载\18fb1f51c9eb63489cce9e029154782e.jpg"
Content-Type: image/jpeg
//这里是空一行 需要注意
<二进制文件数据未显示>
---------------------------7e020233150564--
*/
//向服务器写入数据 这里就需要完全根据以上协议格式来写,需要仔细,避免出错。
out.writeBytes(prefix+boundary+end);//这是第一行 并回车换行
//这是第二行,文件名和对应服务器的
out.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""+uploadname+"\""+end);//这是第二行
out.writeBytes(end);//空一行
//以下写入图片
FileInputStream fileInputStream=new FileInputStream(new File(mfilename));
byte[]b=new byte[1024*4];//缓冲区
int len;
//循环读数据
while((len=fileInputStream.read(b))!=-1){
out.write(b, 0, len);
}
//写完数据后 回车换行
out.writeBytes(end);
out.writeBytes(prefix + boundary + prefix + end);
out.flush();//清空
//创建一个输入流对象 获取返回的信息 是否上传成功
BufferedReader reader=new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sb=new StringBuffer();
String str;
while((str=reader.readLine())!=null){
sb.append(str);
}
//关闭流信息
if(out!=null)out.close();
if(reader!=null)reader.close();
System.out.print("返回结果:"+sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
在run()方法中调用该httpUpload()方法。
MainActivity.java类,代码为:
[java] view
plain copy
</pre><pre name="code" class="java">import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.io.File;
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url="http://125.217.54.155:8080/uploadImage/Uploadimage";
/***获取文件路径 在这部分可以设置为跳转到你的相册选取 暂时写死 以后加上***/
File file= Environment.getExternalStorageDirectory();//获取文件路径
File fileupload=new File(file,"zxy.jpg");//在SD卡里需要有这个图片 不然会获取不到
String name=fileupload.getAbsolutePath();//获取到该图片的绝对路径
UploadImageThread thread=new UploadImageThread(url,name);
thread.start();
}
});
}
}
记得加上联网权限和读取SD卡权限:
[java] view
plain copy
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
运行的结果会在E盘中生成一个图片文件:
3.以上是使用http的方式,这个方式需要谨慎的遵循协议格式,较容易出错,以下使用httpClient第三发库来上传 这种方式比较容易,但是在新版的sdk中,Google已经将该类剔除,需要使用的话:
eclipse里的话,在libs里添加org.apache.http.legacy.jar包
android studio的话里在相应的module下的build.gradle中的
android {
加入:useLibrary 'org.apache.http.legacy'
}
且需要引入两个jar包为:httpcore-4.4.1和httpmine-4.5,后面的数字为版本号,不建议使太高的版本,否则编译不通过。
在uploadHttpClient()写入以下代码:
[java] view
plain copy
/**
* 使用HttpClient来上传数据
*/
public void uploadHttpClient(){
HttpClient client=new DefaultHttpClient();
HttpPost httpPost=new HttpPost(murl);//通过post传递
/**绑定数据 这里需要注意 如果是中文 会出现中文乱码问题 但只要按设置好*/
MultipartEntity muit=new MultipartEntity();
// 上传 文本, 转换编码为utf-8 其中"text" 为字段名,
//Charset.forName(CHARSET)为参数值,可设置为UTF-8,其实就是正常的值转换成utf-8的编码格式
// 后边new StringBody(text,Charset.forName(CHARSET))
File parent= Environment.getExternalStorageDirectory();//路径
File fileupload=new File(parent,"zxy.jpg");
FileBody fileBody=new FileBody(fileupload);
muit.addPart("file",fileBody);
httpPost.setEntity(muit);
/**发送请求*/
try {
HttpResponse response=client.execute(httpPost);
//判断师傅上传成功 返回200
if (response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
System.out.println(EntityUtils.toString(response.getEntity()));
}
} catch (ClientProtocolException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
完成后在run()方法中调用uploadHttpClient()。
[java] view
plain copy
@Override
public void run() {
// httpUpload();
uploadHttpClient();
}
![](https://oscdn.geek-share.com/Uploads/Images/Content/201701/9cc493f1e15b23d0f4eaea0d0f8b35d0.png)
运行结果跟http方法一样,不赘述。至此,三个方法已经全部结束。所需jar可自行下载。
以下是参考的博客:
http://blog.csdn href="http://lib.csdn.net/base/dotnet" target=_blank>.Net/linwei_1029/article/details/6990971
http://blog.csdn.net/MSPinyin/article/details/6141638
向服务器上传图片的实例:
在Java web中上传图片相对比较容易,只需简单几个按钮和应用即可,以下的例子是如何使用http或httpClient向本地服务器上传图片。
1.网页版
在本地创建一个Java web项目并上传图片到本地服务器。服务器版本须为3.0,一般Tomcat7.0以上。
创建web项目 uploadImage,在 webContent目录下创建index.jsp,body中的代码为:
[java] view
plain copy
<form action="Uploadimage" method="post" enctype="multipart/form-data">
<input type="file" name="file"><br>
<input type="submit" value="submit">
</form>
指定数据类型:enctype="multipart/form-data",使用multipart/form-data最后数据会以二进制形式提交给服务器,字符不需要编码不会对服务端的获取有影响。
表单中enctype类型默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传。
具体请参考:http://blog.csdn.NET/MSPinyin/article/details/6141638
创建一个servlet:Uploadimage.jave,需要注意的是在Uploadimage类的上方中需要再添加一个注解标签来指定文件保存的路径,不然会在添加文件上传时报空指针异常。
注解标签为:@MultipartConfig(location="E://"),以下是添加地方。
[java] view
plain copy
@WebServlet("/Uploadimage")
@MultipartConfig(location="E://")
public class Uploadimage extends HttpServlet {
添加完标签以后在doGet方法中调用doPost方法,在doPost方法中写入以下代码:
[java] view
plain copy
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将当前系统时间作为文件的名称避免重名
//Date data=new Date();
SimpleDateFormat adf=new SimpleDateFormat("HHmmss");
String filename=adf.format(new Date());
Part part=request.getPart("file");//获取文件路径
part.write(filename+".jpg");
response.setCharacterEncoding("UTF-8");
PrintWriter out=response.getWriter();
out.print("success!");
System.out.print("上传成功!");
}
注意,Part,引入的包为:
[java] view
plain copy
import javax.servlet.http.Part;
完成以上以后,将web项目运行在服务器上。在web页面选择图片并点击上传,会在你的E盘上生成一个以时间为命名的jsp图片。
至此,通过java web上传图片的例子结束,以下是如何在Android客户端通过http上传图片。
2.通过http从Android客户端上传图片,在这之前,需要先了解在网页上是如何通过multipart/form-data来传输数据的。
打开浏览器,在地址栏输入我们以上网页版的web项目地址:http://localhost:8080/uploadImage,在浏览器:工具----》开发者工具---》网络---》启用网络流量捕获
,然后选择文件,提交。
回到开发者工具后会检测到一个刚提交的数据:
双击打开,会在content-type看到一个编节符的请求头文件信息,点击上方的请求正文,将会看到以下内容,这个内容也将是待会使用http进行图片上传时需要转化数据格式。
需要指出的是,由于浏览器的原因,以上的编节符前面并不是一条直线,而是虚线:
-----------------------------7e020233150564,这个一般由系统随机产生,且开头增加了两个"-",减去这两个”-“就是一个"boundary",boundary这待会会用到的。
Content-Type:image/jpeg 就是文件的 类型。
<二进制文件数据未显示>:这一部分就是上传的图片。
以上的就是通过这样的协议向服务器发送数据。客户端向服务器发送数据时也需要遵守这样的协议。
了解了上传的协议描述后,接下来将是进行代码:
创建项目UploadImageDome,并创建UploadThread.java 类,让该类继承Thread:
创建方法:httpUpload();//该方法中写的是通过http方式上传图片,代码为:
[java] view
plain copy
public void httpUpload(){
String boundary="-------------------------7e020233150564";//编节符
String prefix="--";//前缀 上传时需要多出两个-- 一定需要注意!!!
String end="\r\n";//这里也需要注意,在html协议中,用 “/r/n” 换行,而不是 “/n”。
SimpleDateFormat adf=new SimpleDateFormat("HHmmss");//通过时间来创建文件名
String uploadname=adf.format(new Date())+".jsp";//上传的文件名称
try {
URL http=new URL(murl);
HttpURLConnection conn= (HttpURLConnection) http.openConnection();
conn.setRequestMethod("POST");
conn.setReadTimeout(5000);
conn.setDoInput(true);//准许向服务器读数据
conn.setDoOutput(true);//准许向服务器写入数据
/*设置向服务器上传数据的请求方式 默认的是表单形式
* 通过Content-Type协议向服务器上传数据
* boundary
* */
conn.setRequestProperty("Content-Type","multipart/form-data;boundary="+boundary);
//创建一个输出流对象,
DataOutputStream out=new DataOutputStream(conn.getOutputStream());
/*
*
-----------------------------7e020233150564
Content-Disposition: form-data; name="file"; filename="I:\迅雷下载\18fb1f51c9eb63489cce9e029154782e.jpg"
Content-Type: image/jpeg
//这里是空一行 需要注意
<二进制文件数据未显示>
---------------------------7e020233150564--
*/
//向服务器写入数据 这里就需要完全根据以上协议格式来写,需要仔细,避免出错。
out.writeBytes(prefix+boundary+end);//这是第一行 并回车换行
//这是第二行,文件名和对应服务器的
out.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\""+uploadname+"\""+end);//这是第二行
out.writeBytes(end);//空一行
//以下写入图片
FileInputStream fileInputStream=new FileInputStream(new File(mfilename));
byte[]b=new byte[1024*4];//缓冲区
int len;
//循环读数据
while((len=fileInputStream.read(b))!=-1){
out.write(b, 0, len);
}
//写完数据后 回车换行
out.writeBytes(end);
out.writeBytes(prefix + boundary + prefix + end);
out.flush();//清空
//创建一个输入流对象 获取返回的信息 是否上传成功
BufferedReader reader=new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuffer sb=new StringBuffer();
String str;
while((str=reader.readLine())!=null){
sb.append(str);
}
//关闭流信息
if(out!=null)out.close();
if(reader!=null)reader.close();
System.out.print("返回结果:"+sb.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
在run()方法中调用该httpUpload()方法。
MainActivity.java类,代码为:
[java] view
plain copy
</pre><pre name="code" class="java">import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.io.File;
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url="http://125.217.54.155:8080/uploadImage/Uploadimage";
/***获取文件路径 在这部分可以设置为跳转到你的相册选取 暂时写死 以后加上***/
File file= Environment.getExternalStorageDirectory();//获取文件路径
File fileupload=new File(file,"zxy.jpg");//在SD卡里需要有这个图片 不然会获取不到
String name=fileupload.getAbsolutePath();//获取到该图片的绝对路径
UploadImageThread thread=new UploadImageThread(url,name);
thread.start();
}
});
}
}
记得加上联网权限和读取SD卡权限:
[java] view
plain copy
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
运行的结果会在E盘中生成一个图片文件:
3.以上是使用http的方式,这个方式需要谨慎的遵循协议格式,较容易出错,以下使用httpClient第三发库来上传 这种方式比较容易,但是在新版的sdk中,Google已经将该类剔除,需要使用的话:
eclipse里的话,在libs里添加org.apache.http.legacy.jar包
android studio的话里在相应的module下的build.gradle中的
android {
加入:useLibrary 'org.apache.http.legacy'
}
且需要引入两个jar包为:httpcore-4.4.1和httpmine-4.5,后面的数字为版本号,不建议使太高的版本,否则编译不通过。
在uploadHttpClient()写入以下代码:
[java] view
plain copy
/**
* 使用HttpClient来上传数据
*/
public void uploadHttpClient(){
HttpClient client=new DefaultHttpClient();
HttpPost httpPost=new HttpPost(murl);//通过post传递
/**绑定数据 这里需要注意 如果是中文 会出现中文乱码问题 但只要按设置好*/
MultipartEntity muit=new MultipartEntity();
// 上传 文本, 转换编码为utf-8 其中"text" 为字段名,
//Charset.forName(CHARSET)为参数值,可设置为UTF-8,其实就是正常的值转换成utf-8的编码格式
// 后边new StringBody(text,Charset.forName(CHARSET))
File parent= Environment.getExternalStorageDirectory();//路径
File fileupload=new File(parent,"zxy.jpg");
FileBody fileBody=new FileBody(fileupload);
muit.addPart("file",fileBody);
httpPost.setEntity(muit);
/**发送请求*/
try {
HttpResponse response=client.execute(httpPost);
//判断师傅上传成功 返回200
if (response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
System.out.println(EntityUtils.toString(response.getEntity()));
}
} catch (ClientProtocolException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
完成后在run()方法中调用uploadHttpClient()。
[java] view
plain copy
@Override
public void run() {
// httpUpload();
uploadHttpClient();
}
![](https://oscdn.geek-share.com/Uploads/Images/Content/201701/9cc493f1e15b23d0f4eaea0d0f8b35d0.png)
运行结果跟http方法一样,不赘述。至此,三个方法已经全部结束。所需jar可自行下载。
以下是参考的博客:
http://blog.csdn href="http://lib.csdn.net/base/dotnet" target=_blank>.Net/linwei_1029/article/details/6990971
http://blog.csdn.net/MSPinyin/article/details/6141638
相关文章推荐
- 如何使用http或httpClient向服务器上传图片 以及使用http上传图片时协议的描述
- UWP 使用Windows.Web.Http命名空间下的HttpClient使用post方法,上传图片服务器
- iOS使用http post多图片上传带描述+java后台服务器,简单实现例子.
- android使用AsyncHttpClient上传图片以及参数到服务器
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- 通过 Socket 发送 Http协议 上传图片到速卖通服务器过程中遇到的一些小的问题 总结
- 【Ts 3】Nginx的Http(图片)服务器配置+ftp上传使用说明
- 上传图片并保存到服务器上之后,如何得到该图片服务器路径(http://~)
- 使用httputils上传图片到服务器
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- Android使用AsyncTask加http用post方式上传图片到服务器
- 【转】asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- 图片服务器搭建 ftp上传http协议读取图片
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- 上传图片并保存到服务器上之后,如何得到该图片服务器路径(http://~)
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)
- 如何使用AF上传图片到服务器
- android上传图片到服务器(使用base64字节流的形式通过 AsyncHttpClient框架传输)