舉個例子
手機端
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圖片格式的
從手機拷貝下來的圖片