app手機端如何把圖片上傳到java服務器端

舉個例子

手機端

        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圖片格式的

 


從手機拷貝下來的圖片

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章