Ava100的gravatar头像
Ava1002017-08-02 21:57:02

httpClient文件上传为啥无法进入服务端方法?

死都进不去http://127.0.0.1:8888/upload/processUpload这个方法中,各路大神知道怎么进去吗?

client:

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Set;

import javax.ws.rs.Path;

import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;

import ******.UploadService;

public class UploadClient {
    
    private static UploadClient uploadClient;
    
    public static UploadClient getInstance(){
        if (uploadClient == null) {
            uploadClient = new UploadClient();
        } 
        return uploadClient;
    }
    
    @Autowired 
    UploadService uploadService;
    
     /** 
     * 上传文件 
     *  
     * @param serverUrl 
     *            服务器地址 
     * @param localFilePath 
     *            本地文件路径 
     * @param serverFieldName 
     * @param params 
     * @return 
     * @throws Exception 
     */  
    public String uploadFileImpl(String serverUrl, String localFilePath,  
            String serverFieldName, Map<String, String> params)  
            throws Exception {  
        String respStr = null;  
        CloseableHttpClient httpclient = HttpClients.createDefault();  
        try {  
            HttpPost httppost = new HttpPost(serverUrl);  
            FileBody binFileBody = new FileBody(new File(localFilePath));  
  
            MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder  
                    .create();  
            // add the file params  
            multipartEntityBuilder.addPart(serverFieldName, binFileBody);  
            // 设置上传的其他参数  
            setUploadParams(multipartEntityBuilder, params);  
  
            HttpEntity reqEntity = multipartEntityBuilder.build();  
            httppost.setEntity(reqEntity);    
            CloseableHttpResponse response = httpclient.execute(httppost);  
            try {  
                System.out.println(response.getStatusLine());  
                HttpEntity resEntity = response.getEntity();  
                respStr = getRespString(resEntity);  
                EntityUtils.consume(resEntity);  
            } finally {  
                response.close();  
            }  
        } finally {  
            httpclient.close();  
        }  
        System.out.println("resp=" + respStr);  
        return respStr;  
    }  
  
    /** 
     * 设置上传文件时所附带的其他参数 
     *  
     * @param multipartEntityBuilder 
     * @param params 
     */  
    private void setUploadParams(MultipartEntityBuilder multipartEntityBuilder,  
            Map<String, String> params) {  
        if (params != null && params.size() > 0) {  
            Set<String> keys = params.keySet();  
            for (String key : keys) {  
                multipartEntityBuilder  
                        .addPart(key, new StringBody(params.get(key),  
                                ContentType.TEXT_PLAIN));  
            }  
        }  
    }  
  
    /** 
     * 将返回结果转化为String 
     *  
     * @param entity 
     * @return 
     * @throws Exception 
     */  
    private String getRespString(HttpEntity entity) throws Exception {  
        if (entity == null) {  
            return null;  
        }  
        InputStream is = entity.getContent();  
        StringBuffer strBuf = new StringBuffer();  
        byte[] buffer = new byte[4096];  
        int r = 0;  
        while ((r = is.read(buffer)) > 0) {  
            strBuf.append(new String(buffer, 0, r, "UTF-8"));  
        }  
        return strBuf.toString();  
    }  
}  
    
    server:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public interface UploadService {
    /**
     * 文件上传
     * 
     * @param input
     * @return
     */
    public void processUpload(HttpServletRequest request, HttpServletResponse response) throws Exception;
}


    serverImpl:

import java.io.File;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;
import com.alibaba.fastjson.JSON;

import *******.UploadService;
import *****.UploadClient;
import ******.CarApiServiceImpl;

@Path("/upload")
@Service("uploadService")
public class uploadServerImpl implements UploadService {
    public static final Logger log4j = LoggerFactory
            .getLogger(uploadServerImpl.class);
    @Autowired
    private UploadClient uploadClient;
    
    @POST
    @Path("/processUpload")
    @Produces({ ContentType.APPLICATION_JSON_UTF_8 })
    @Consumes({ MediaType.APPLICATION_JSON })
    @Transactional(readOnly = false)
    @Override
    public void processUpload(HttpServletRequest request, HttpServletResponse response){

       request.setCharacterEncoding("utf-8"); 
        response.setCharacterEncoding("utf-8");  
          
        //检测是不是存在上传文件  
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);  
          
        if(isMultipart){  
            DiskFileItemFactory factory = new DiskFileItemFactory();  
            
            String path = request.getRealPath("/file_upload_path");//得到上传文件的存放目录
            File dir = new File(path);
            if(!dir.exists()) {
                    dir.mkdirs(); 
            }
            
            
            //指定在内存中缓存数据大小,单位为byte,这里设为1Mb  
            factory.setSizeThreshold(1024*1024);  
           
            //设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录   
            factory.setRepository(new File("D:\\temp"));  
            
            // Create a new file upload handler  
            ServletFileUpload upload = new ServletFileUpload(factory);  
           
            // 指定单个上传文件的最大尺寸,单位:字节,这里设为50Mb    
            upload.setFileSizeMax(50 * 1024 * 1024);    
            
            //指定一次上传多个文件的总尺寸,单位:字节,这里设为50Mb  
            upload.setSizeMax(50 * 1024 * 1024);     
            upload.setHeaderEncoding("UTF-8");
              
            List<FileItem> items = null;  
              
            try {  
                // 解析request请求  
                items = upload.parseRequest(request);  
            } catch (FileUploadException e) {  
                e.printStackTrace();  
            }  
            
            if(items!=null){  
                //解析表单项目  
                Iterator<FileItem> iter = items.iterator();  
                while (iter.hasNext()) {  
                    FileItem item = iter.next(); 
                    
                    //如果是普通表单属性  
                    if (item.isFormField()) {  
                        //相当于input的name属性   <input type="text" name="content">  
                        String name = item.getFieldName();
                        
                        //input的value属性  
                        String value = item.getString();
                        
                        System.out.println("属性:" + name + " 属性值:" + value);  
                    }  
                    //如果是上传文件  
                    else {  
                        //属性名  
                        String fieldName = item.getFieldName();  
                        
                        //上传文件路径  
                        String fileName = item.getName();  
                        fileName = fileName.substring(fileName.lastIndexOf("/") + 1);// 获得上传文件的文件名  
                        
                        try {  
                            item.write(new File(dir, fileName));  
                        } catch (Exception e) {  
                            e.printStackTrace();  
                        }  
                    } 
                }  
            }  
        }  
        
        response.addHeader("token", "hello");
    }
   
}


test:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.aspectj.weaver.patterns.ThisOrTargetAnnotationPointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import *****.UploadService;

public class UploadTest {
    
    @Value("${file.upload.path}")
    private String file_upload_path;
    
    @Autowired
    UploadService uploadService;
    
    @Autowired
    static UploadClient uploadClient;
    
    public static void main(String[] args) throws ClientProtocolException, IOException, ParseException {
        try {  
            Map<String,String> uploadParams = new LinkedHashMap<String, String>();  
            uploadParams.put("userImageContentType", "image");  
            uploadParams.put("userImageFileName", "testaa.png");  
            uploadClient.getInstance().uploadFileImpl(  
                    "http://127.0.0.1:8888/upload/processUpload", "F:\\testpics\\aa.jpg",  
                    "file_upload_path", uploadParams);  
            
            HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://localhost:8888/upload/processUpload");
            
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }
}


    

所有回答列表(3)
最代码官方的gravatar头像
最代码官方 LV48月2日

1.确认服务端http://127.0.0.1:8888/upload/processUpload可访问

包括软件层程序正常,硬件网络层ip可以访问

2.通过其他方式测试服务端是否正常

比如写一个html网页,表单模拟http get和post请求

3.服务端增加日志

总之想办法确认客户端和服务端是否可以正常连通。

Ava100的gravatar头像
Ava1008月4日

感谢提供思路,正在解决中。。。。。

tian269mu的gravatar头像
tian269mu8月7日

肯定报错了,如果开发工具那看不到,在浏览器中f12,查看请求对应结果

最近浏览
xueyiblood12月4日
暂无贡献等级
zuidaima_kyu10月18日
暂无贡献等级
liangxiang10月12日
最代码贡献等级说明
jiangD9月8日
暂无贡献等级
beihe8月26日
最代码贡献等级说明
malei1238月23日
最代码贡献等级说明
zhaoshuting8月22日
最代码贡献等级说明
Ckxlnd8月18日
最代码贡献等级说明
plmokn01028月17日
最代码贡献等级说明
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友