app手机端如何把图片上传到java服务器端

版权声明:博客知识产权来源命运的信徒,切勿侵权 https://blog.csdn.net/qq_37591637/article/details/88812879

举个例子

手机端

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


从手机拷贝下来的图片

 

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/88812879
今日推荐