采用HttpClient3.x上传文件 spring 文件上传

最近,项目需要调用第三方的系统上传图片,在长传图片的同时,还需要携带其他的请求参数;整体的流程是:网页----》spring mvc---》业务处理----》调用第三方系统上传图片;

在此期间遇到的问题是:在调用第三方系统上传图片时,除了图片文件参数外,其他参数期望通过request.getParameter()方法能够访问到,采用了很多方式,都不行,最终通过不断的尝试,测试成功,特贡献出来供需要的人员参考!

  1. 采用spring 的MultipartFile进行文件上传,代码如下

        

@Note(note = "bigAnt:上传文件", author = "zhangwenbo")
    @RequestMapping("midifyPicture")
    @ResponseBody
    public SimpleMessage<Object> modifyPicture(@RequestParam("file") MultipartFile file, HttpServletRequest req) {

logger.info("modifyHeaderPicture has invoked.filename is " + file.getOriginalFilename());

SimpleMessage<Object> sm = new SimpleMessage<Object>();

int index = file.getOriginalFilename().lastIndexOf(".");

String imageSupportType = SpiConfig.getPropValue("IMAGE_SUPPORT_TYPE");

if (imageSupportType.indexOf("," + file.getOriginalFilename().substring(index + 1) + ",") < 0) {
            sm.set("message", "file type is error.the support type is " + imageSupportType.substring(1, imageSupportType.length() - 1));

logger.info("the file type is error.the req file type is " + file.getOriginalFilename().substring(index + 1));

return sm;
        }

File fileIO = null;

try {
            fileIO = File.createTempFile(file.getOriginalFilename().substring(0, index), file.getOriginalFilename().substring(index + 1));

if (!fileIO.exists()) {
                fileIO.createNewFile();
            }

file.transferTo(fileIO);

} catch (IOException e) {
            logger.warn("transferto file fail.", e);
        }

Map<String, Object> postBody = new HashMap<String, Object>();

postBody.put("loginname", req.getSession().getAttribute(BigAntHelper.SESSION_USER_ID));

BigAntBaseRes uploadResult = BigAntClient.getInstance().uploadPicture(postBody, file.getOriginalFilename(), fileIO);

logger.info("upload return msg is " + uploadResult);

if (null != uploadResult) {
            if ("1".equals(uploadResult.getStatus().trim())) {
                sm.set("data", uploadResult.getData());
            } else {
                sm.set("message", uploadResult.getMsg());
            }
        } else {
            sm.set("message", "upload fail");
        }
        return sm;
    }

2.采用HTTPCLIENT3.x上传文件,代码如下

/**
     * 长传文件<br/>
     * @param postBody
     * @param filename
     * @param file
     * @return
     */
    public BigAntBaseRes uploadPicture(Map<String,Object> postBody,String filename,File file){
        logger.info("upload file");
        postBody.put("token",SpiConfig.getPropValue("BIGANT_BASE_TOKEN"));
        postBody.put("op", "uploadAvater");
        return UploadFileClient.uploadFile(BigAntHelper.getUploadUrl(), postBody, filename, file,BigAntBaseRes.class);
    }
    
    /**
     * 长传文件<br/>
     *
     * @param url
     *            目标服务的url<br/>
     * @param reqParams
     *            请求参数<br/>
     * @param filename
     *            需要上传的文件名称<br/>
     * @param file
     *            需要上传的文件<br/>
     * @return
     */
    public static <T> T uploadFile(String url, Map<String, Object> reqParams, String filename, File file, Class<T> returnClass) {

HttpClient client = new HttpClient();

logger.info("URL:" + url + " and the filename is " + filename);

HttpConnectionManagerParams managerParams = client.getHttpConnectionManager().getParams();

managerParams.setConnectionTimeout(10000);

PostMethod post = new PostMethod(url);

HttpMethodParams params = post.getParams();

params.setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");

params.setContentCharset("UTF-8");

// 设置消息体

List<Part> requestPart = new ArrayList<Part>();

if (null != reqParams && reqParams.size() > 0) {
            Iterator<String> it = reqParams.keySet().iterator();

while (it.hasNext()) {
                String key = it.next();

if (null != reqParams.get(key)) {
                    try {
                        requestPart.add(new StringPart(key, URLEncoder.encode(reqParams.get(key).toString(), "UTF-8")));

logger.info("key:" + key + " and value is :" + URLEncoder.encode(reqParams.get(key).toString(), "UTF-8"));

} catch (Exception e) {
                        logger.warn("parse the send msg fail.", e);
                    }
                }
            }
        }

try {
            // 设置文件内容
            requestPart.add(new FilePart(filename, file));

post.setRequestEntity(new MultipartRequestEntity(requestPart.toArray(new Part[1]), post.getParams()));

int status = client.executeMethod(post);

String result = post.getResponseBodyAsString();

if (status == HttpStatus.SC_OK) {
                logger.info("return result of uploading file is " + result);
            } else {
                if (null != result) {
                    result = "upload fail";
                }
                logger.warn("upload file fail.");
            }

Gson gson = new Gson();

T returnResult = gson.fromJson(result, returnClass);

return returnResult;
        } catch (Exception e) {
            e.printStackTrace();
            logger.warn("upload file fail.the filename is " + filename, e);
        } finally {
            if (null != post) {
                post.releaseConnection();
            }
        }
        return null;
    }

时间: 2024-10-10 17:24:27

采用HttpClient3.x上传文件 spring 文件上传的相关文章

spring mvc文件spring文件配置

<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8"

Spring Boot 上传文件

1.上传文件 Spring Boot 上传文件也是使用 MultipartFile 类,和 Spring MVC 其实差不多,参考文章:https://www.cnblogs.com/jwen1994/p/11182923.html HTML <form enctype="multipart/form-data" method="post" action="/upload"> 文件:<input type="file&

spring mvc上传文件的简单例子总结及注意事项

1.创建maven项目         在pom.xml里面引入该依赖的jar包,pom.xm的代码如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven

ajax+spring文件上传

1.js代码 $(function(){ $('#upfileID').change(function(){ $.ajaxFileUpload({ url: '/upload/image', type: 'post', secureuri: false, //一般设置为false fileElementId: 'upfileID', // 上传文件的id属性名 dataType: 'text', //返回值类型,一般设置为json.application/json success: functi

文件上传--基于Spring MVC框架+SmartUpload

这篇文章是介绍文件上传的,由于在spring MVC上实现起来和直接在servlet中写有些不同,所以特地写了一下这篇文章,关于不同点,大家可以先阅读一下上一篇文章.好了,下面直接上代码. jab包是jspSmartUpload.jar,如果有类似的jar包如:commons-fileupload-1.2.2,留一个即可,否则会冲突报错 首先是一个简单的页面(jsp),比较丑,但能用: <%@ page language="java" contentType="text

Spring文件上传

因为文件上传这样的工作一般来说是开发人员自定的,所以Spring默认是不处理multipart请求的.但Spring为multipart做了些通用的支持性工作. Form元素 Form元素的enctype必须是multipart/form-data. Configuration MultipartResolver 处理multipart请求需要一个MultipartResolver: <bean id="multipartResolver" class="org.spr

spring mvc上传文件服务器配置

在使用springMVC进行系统实现时,springMVC默认的解析器里面是没有加入对文件上传的解析的.但如果你想使用springMVC对文件上传的解析器来处理文件上传的时候就需要在spring的applicationContext里面加上springMVC提供的MultipartResolver的申明.客户端每次进行请求的时候,springMVC都会检查request里面是否包含多媒体信息,如果包含了就会使用MultipartResolver进行解析,springMVC会使用一个支持文件处理的

springboot(十七):使用Spring Boot上传文件

上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个Spring Boot上传文件的小案例. 1.pom包配置 我们使用Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0. <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId>

(转)Spring文件上传,包括一次选中多个文件

背景: http://www.cnblogs.com/lixuwu/p/8495275.html已经实现了单文件的上传和下载,多文件的上传是另一种情景,这里记录下来 实现过程 先说前台. 运行以后就是这样子的. 一个非常简单的表单页面, 两个文件上传按钮, 一个提交 其中单个文件上传, 即只能选择一个文件, 无法同时选择多个 相对的, 多个文件就是可以同时选择多个文件了 文件选择以后就是这个样子 前台设置 代码如下: 一个form, 文件上传就是一个<input>输入, 属性type=&quo