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<String> 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文件配置:

<bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"></property>
        <property name="maxUploadSize" value="102400000"></property>
    </bean>

后台代码:

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

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<String, Object> filesUpload(HttpServletRequest request, @RequestParam("files") MultipartFile[] files, @RequestParam("folderPath") String folderPath) throws IOException {
        JSONArray fileNames = new JSONArray();
        Map<String, Object> returnMap = new HashMap<String, Object>();
        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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容