安卓开发多文件上传Spring MVC作为服务器端

服务器端核心代码:

package com.missionsky.mvc.controller;

import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@Controller
@RequestMapping("/upload.do")
public class UploadController {
    @RequestMapping(params = "intent=upload")
    public void uploadFile(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
        int num = 0;
        System.out.println("FileUploadOrLoad");
        // 设置request编码,主要是为了处理普通输入框中的中文问题
        request.setCharacterEncoding("UTF-8");
        // 这里对request进行封装,RequestContext提供了对request多个访问方法
        org.apache.commons.fileupload.RequestContext requestContext = new ServletRequestContext(request);
        // 判断表单是否是Multipart类型的。这里可以直接对request进行判断,不过已经以前的用法了
        if (FileUpload.isMultipartContent(requestContext)) {

            num++;
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // 设置文件的缓存路径
            factory.setRepository(new File("d:/tmp/"));
            File dir = new File("d:\\download");
            System.out.println("dir");

            if (!dir.exists()) {
                dir.mkdirs();
            }
            // System.out.print("已经生成临时文件");

            ServletFileUpload upload = new ServletFileUpload(factory);
            // 设置上传文件大小的上限,-1表示无上限
            upload.setSizeMax(100000 * 1024 * 1024);
            List items = new ArrayList();
            try {
                // 上传文件,并解析出所有的表单字段,包括普通字段和文件字段
                items = upload.parseRequest(request);
            } catch (FileUploadException e1) {
                System.out.println("文件上传发生错误" + e1.getMessage());
            }
            // 下面对每个字段进行处理,分普通字段和文件字段
            Iterator it = items.iterator();


            while (it.hasNext()) {
                DiskFileItem fileItem = (DiskFileItem) it.next();
                // 如果是普通字段
                if (fileItem.isFormField()) {
                    System.out.println(fileItem.getFieldName()
                            + "   "
                            + fileItem.getName()
                            + "   "
                            + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));
                } else {
                    System.out.println(fileItem.getFieldName() + "   "
                            + fileItem.getName() + "   "
                            + fileItem.isInMemory() + "    "
                            + fileItem.getContentType() + "   "
                            + fileItem.getSize());
                    // 保存文件,其实就是把缓存里的数据写到目标路径下
                    if (fileItem.getName() != null && fileItem.getSize() != 0) {
                        File fullFile = new File(fileItem.getName());
                        File newFile = new File("d:/download/"
                                + fullFile.getName() + num);
                        try {
                            fileItem.write(newFile);
                            // 文件上传成功 跟新数据库任务表    添加对应任务
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {
                        System.out.println("文件没有选择 或 文件内容为空");
                    }
                }
            }

            //上传完毕后手动删除缓存的 文件
            File file = new File("D:/tmp");
            if (file.exists()) {
                File[] listFiles = file.listFiles();
                for (File deleteFile : listFiles) {
                    deleteFile.delete();
                }
            }

            // 设置响应码
            response.setStatus(200);
        }
    }
}

客户端核心代码:

new UploadTask("http://192.168.206.125:8080/spring/upload.do?intent=upload", files).execute();


②
private class UploadTask extends AsyncTask<Void, Void, String> {

        private String url;
        private List<File> files;

        public UploadTask(String url, List<File> files) {
            // TODO Auto-generated constructor stub
            this.url = url;
            this.files = files;
        }

        @Override
        protected String doInBackground(Void... params) {
            // TODO Auto-generated method stub
            return uploadFile(url, files);
        }

        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);

            Toast.makeText(mActivity, result, Toast.LENGTH_SHORT).show();
        }
    }

    ③
    private String uploadFile(String url, List<File> files) {
        HttpClient client=new DefaultHttpClient();// 开启一个客户端 HTTP 请求 
        HttpPost post = new HttpPost(url);//创建 HTTP POST 请求  
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
//      builder.setCharset(Charset.forName("uft-8"));//设置请求的编码格式
        builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式
        int count=0;
        for (File file:files) {
//          FileBody fileBody = new FileBody(file);//把文件转换成流对象FileBody
//          builder.addPart("file"+count, fileBody);
            builder.addBinaryBody("file"+count, file);
            count++;
        }

        builder.addTextBody("method", "upload");//设置请求参数
        builder.addTextBody("fileTypes", ".pcap");//设置请求参数
        HttpEntity entity = builder.build();// 生成 HTTP POST 实体      
        post.setEntity(entity);//设置请求参数
        HttpResponse response = null;
        try {
            response = client.execute(post);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }// 发起请求 并返回请求的响应
        if (response != null && response.getStatusLine().getStatusCode()==200) {
            return "上传成功";
        }
        return "上传失败";  
    }

服务器要用到的jar包:

<dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
</dependency>

客户端要用到的jar包:
httpcore-4.3.2.jar
httpmime-4.3.5.jar

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值