Android上传单文件和多文件(后台使用MultipartFile)

android代码:

package heath.com.microchat.utils;

import android.util.Log;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import java.io.File;
import java.nio.charset.Charset;
import java.util.List;

import heath.com.microchat.service.ServiceRulesException;

public class UploadServerUtils {

    public static String uploadLogFile(String uploadUrl, String filePath, String folderPath) {
        String result = null;
        try {
            HttpClient hc = new DefaultHttpClient();
            hc.getParams().setParameter(
                    CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
            HttpPost hp = new HttpPost(uploadUrl);
            File file = new File(filePath);
            final MultipartEntity entity = new MultipartEntity();
            ContentBody contentBody = new FileBody(file);
            entity.addPart("file", contentBody);
            entity.addPart("folderPath", new StringBody(folderPath, Charset.forName("UTF-8")));
            hp.setEntity(entity);
            HttpResponse hr = hc.execute(hp);
            HttpEntity he = hr.getEntity();
            int statusCode = hr.getStatusLine().getStatusCode();
            if (statusCode != HttpStatus.SC_OK)
                throw new ServiceRulesException(Common.MSG_SERVER_ERROR);

            result = EntityUtils.toString(he, HTTP.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("TAG", "文件上传失败!上传文件为:" + filePath);
            Log.e("TAG", "报错信息toString:" + e.toString());
        }
        return result;
    }

    public static String uploadLogFiles(String uploadUrl, List filePaths, String folderPath) {
        String result = null;
        try {
            HttpClient hc = new DefaultHttpClient();
            hc.getParams().setParameter(
                    CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
            HttpPost hp = new HttpPost(uploadUrl);
            final MultipartEntity entity = new MultipartEntity();
            for (String filePath:filePaths){
                File file = new File(filePath);
                ContentBody contentBody = new FileBody(file);
                entity.addPart("files", contentBody);
            }
            entity.addPart("folderPath", new StringBody(folderPath, Charset.forName("UTF-8")));
            hp.setEntity(entity);
            HttpResponse hr = hc.execute(hp);
            HttpEntity he = hr.getEntity();
            int statusCode = hr.getStatusLine().getStatusCode();
            if (statusCode != HttpStatus.SC_OK)
                throw new ServiceRulesException(Common.MSG_SERVER_ERROR);
            result = EntityUtils.toString(he, HTTP.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("TAG", "文件上传失败!上传文件为:" + filePaths.toString());
            Log.e("TAG", "报错信息toString:" + e.toString());
        }
        return result;
    }

}

后台代码及环境:

环境:tomcat8.5及以上,需要commons-fileupload-1.3.1.jar、commons-io-2.4.jar两个jar包;

本上传使用SSM框架,所以在springmvc.xml文件配置:


        
        
    

后台代码:

本上传示例,本人使用的是前端传入上传路劲,不在后台定死路劲。

package org.heath.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.heath.utils.RandomCode;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import net.sf.json.JSONArray;

@Controller
@RequestMapping("upload")
@ResponseBody
public class UploadController {

    @RequestMapping("fileUpload.action")
    private String fileUpload(HttpServletRequest request, @RequestParam("file") MultipartFile file, @RequestParam("folderPath") String folderPath) throws IOException {
        String fileName = "error";
        try {
            fileName = file.getOriginalFilename();
            fileName = "MicroChat_" + RandomCode.getRandomCode() + "_" + fileName;
            folderPath = request.getServletContext().getRealPath(folderPath);
            InputStream input = file.getInputStream();
            File folder = new File(folderPath);
            judeDirExists(folder);
            OutputStream outputStream = new FileOutputStream(
                    folderPath + File.separator + fileName);
            byte[] b = new byte[1024];
            while ((input.read(b)) != -1) {
                outputStream.write(b);
            }
            input.close();
            outputStream.close();
            return fileName;
        } catch (Exception e) {
            e.printStackTrace();
            return "error";
        }
    }

    @RequestMapping("filesUpload.action")
    private Map filesUpload(HttpServletRequest request, @RequestParam("files") MultipartFile[] files, @RequestParam("folderPath") String folderPath) throws IOException {
        JSONArray fileNames = new JSONArray();
        Map returnMap = new HashMap();
        folderPath = request.getServletContext().getRealPath(folderPath);
        try {
            for (int i = 0; i < files.length; i++) {
                String fileName = files[i].getOriginalFilename();
                fileName = "MicroChat_" + RandomCode.getRandomCode() + "_" + fileName;
                InputStream input = files[i].getInputStream();
                File folder = new File(folderPath);
                judeDirExists(folder);
                OutputStream outputStream = new FileOutputStream(
                        folderPath + File.separator + fileName);
                byte[] b = new byte[1024];
                while ((input.read(b)) != -1) {
                    outputStream.write(b);
                }
                input.close();
                outputStream.close();
                fileNames.add(fileName);
            }
            returnMap.put("code", "200");
            returnMap.put("msg", "success");
            returnMap.put("fileNames", fileNames);
            return returnMap;
        } catch (Exception e) {
            e.printStackTrace();
            returnMap.put("code", "414");
            returnMap.put("msg", "error");
            return returnMap;
        }
    }

    // 判断文件夹是否存在
    public static void judeDirExists(File file) {

        if (file.exists()) {
            if (file.isDirectory()) {
                System.out.println("dir exists");
            } else {
                System.out.println("the same name file exists, can not create dir");
            }
        } else {
            System.out.println("dir not exists, create it ...");
            file.mkdir();
        }

    }

}

文件及jar下载地址:https://download.csdn.net/download/qq_32090185/10930145

有不懂的地方,可以留言,我看到会进行回复。

你可能感兴趣的:(Android上传单文件和多文件(后台使用MultipartFile))