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,查看请求对应结果

最近浏览
Ckxlnd8月18日
最代码贡献等级说明
plmokn01028月17日
最代码贡献等级说明
sunlsy8月17日
暂无贡献等级
wsh5644940628月16日
最代码贡献等级说明
fellowfun8月15日
最代码贡献等级说明
perfect8月14日
最代码贡献等级说明
tangld8月14日
最代码贡献等级说明
zhaoxny8月12日
最代码贡献等级说明
xiaotian1838月12日
暂无贡献等级
4558493438月11日
暂无贡献等级
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友