举个例子
手机端
apicloud做的app前端
服务器
java语言
实现什么?
在手机端上传图片到java服务器上
所需的jar包
common-io.jar
common-fileupload.jar
apicloud 上的html代码,以下是注意点
1、action是你后台服务器的ip地址+端口号+项目名+类名
2、method="post" 不是get
3、enctype="multipart/form-data"要设置,不然后来可能导致图片上传不成功
4、文件的类型type="file"
5、提交的方式submit
<form action="http://192.168.0.107:8080/jiekou/HelloServlet" method="post" enctype="multipart/form-data" data-ajax="false">
上传图片 :<input type="file" name="img"/>
<input type="submit" value="上传" />
</form>
第一种、html+servlet
HelloServlet代码如下
package cn.com.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置字符的编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//你读取手机端app图片以后要把图片存放在服务器上的位置
String fpath = "D:/myapp";
File fname=new File(fpath);
// 获得磁盘文件条目工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置暂放文件的存储室,这个存储室可以和最终存储文件的文件夹不同。因为当文件很大的时候回占用过多的内存,就暂放存储室
//设置所有上传数据的最大值,单位字节long 1M
factory.setSizeThreshold(1024 * 1024);
factory.setRepository(fname);
// 上传工具处理类
ServletFileUpload upload = new ServletFileUpload(factory);
// 调用parseRequest方法,获得上传文件fileitem的集合list可实现多文件上传
try {
// 解析请求
List<FileItem> list = (List<FileItem>)upload.parseRequest(request);
for (FileItem item : list) {
// 获取表单属性的名字
String name = item.getFieldName();
// 如果获取的变动信息是普通的文本信息的话,即通过页面表单的形式传递来的字符串
if (item.isFormField()) {
String value = item.getString();
request.setAttribute(name, value);
}
// 如果传过来的是图片。音频
else {
// 获取路径名
String value = item.getName();
// 截取上传文件的字符串的名字,+1是去掉反斜杠
String filename = value.substring(value.lastIndexOf("\\") + 1);
// 第三方提供的方法直接写到文件中
InputStream in = item.getInputStream();
FileOutputStream out = new FileOutputStream(new File(fpath
+ "/" + filename));
int length = 0;
byte[] by = new byte[1024];
System.out.println("获取文件总量的容量" + item.getSize());
while ((length = in.read(by)) != -1) {
out.write(by, 0, length);
}
in.close();
out.close();
System.out.println("图片上传到" + fpath + "/" + filename);
}
}
// 如果chunguo
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
web.xml里面配置servlet
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>cn.com.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
到这里,所有的代码,细节点,都介绍完毕,在手机端上传app到电脑服务器上,应该成功实现了!!
但是,我的比较特殊,我使用ssh框架做的,我百度了一个下午+一个晚上+一个早上,
List<FileItem> list 是null的,一直都是null的?
原因是
List<FileItem> fileItemList = upload.parseRequest(request);
解析表单中的每一个表单项,封装成FileItem对象,以List方式返回。
当前台有请求发送过来的时候,会由
将web.xml配置文件做相应修改即可完成。修改如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
改成
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
问题就解决了,真神奇!
第二种、html+ssh框架
前提所需的jar包
common-io.jar
common-fileupload.jar
web.xml里面拦截器配置
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
html页面
<form action="cim.action" method="post" enctype="multipart/form-data" data-ajax="false">
上传图片 :<input type="file" name="file" />
<input type="submit" value="上传1" />
</form>
struts.xml文件相关配置
<action name="cim" class="copyImage" method="GenerateImage">
</action>
最重要的部分来了
思路:
根据拦截器自动给前后台属性名称一致的属性赋值,获取file文件.tmp格式的,根据文件的输入输出流复制文件到服务器上
java类
package cn.com.service;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
@Repository(value = "copyImage")
@Scope("prototype")
public class CopyImage {
private File file;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String GenerateImage(){
//upload_aa00f2d2_bb13_4737_8033_f1394d1b0911_00000000.tmp
System.out.println("文件名"+file.getName());
//把文件写到里面
File fl=new File("D:/myapp"+ "/a.jpg");
FileOutputStream fout=null;
InputStream in=null;
try {
fout=new FileOutputStream(fl);
in=new FileInputStream(file);
byte [] by=new byte[1024];
int length=0;
try {
while((length=in.read(by))>-1){
fout.write(by, 0, length);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
in.close();
fout.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println();
return null;
}
}
注意:
我们可以看到app手机端接收的file是tmp形式的,所以我们把这个文件放在服务器文件夹里面的时候,记得给后缀名改成jpg或者png图片格式的
从手机拷贝下来的图片