1. 程式人生 > >JAVA實現多個附件傳輸

JAVA實現多個附件傳輸

需要引入以下jar包

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-test</artifactId>
   <version>4.2.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.5.3</version>
</dependency>
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;

public class FileUpload{

    private final String thirdUrl = "http://12.0.0.1/v1/api/test";
    private final String[] File_Types = {"doc","docx","xlsx","xls","pptx"};//限制檔案傳輸型別
    private final int limitSize = 10;//限制檔案傳輸大小


    public void send(String title, String content, List<File> fileList){
	List<MultipartFile> multiFileList = new ArrayList<>();
	long totalSize = 0;
	for(File file : fileList){
	    String fileFullName = file.getName();
	    String[] fileNameParts = fileFullName.split("\\.");	
	    if(!Arrays.asList(File_Types).contains(fileNameParts[1])){
		logger.warn("========== file type is {}, cannot be transferred to the 3rd part", fileNameParts[1]);
		continue;
	    }
	    try {
                    InputStream inputStream = new FileInputStream(file);
		    MultipartFile multipartFile = new MockMultipartFile(fileNameParts[0], fileFullName, null,inputStream);
		    totalSize += multipartFile.getSize();
		    if ((totalSize / 1024 / 1024) > limitSize){
			logger.warn("========= the file size must be less than 10MB!");
			return;
		    }
		    multiFileList.add(multipartFile);
		} catch (Exception e) {
		    logger.error("獲取附件失敗:", e);
		    return;
		}
	}
	Map<String,Object> params = new HashMap<>();
	params.put("title", title);
	params.put("content", content);
	params.put("multiFiles", multiFileList);
	try {
		HttpMultiPartFileUtil.httpPostRequest(thirdUrl, "files", params, 5000);
	} catch (Exception e) {
		e.printStackTrace();
	}
    }
}
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HTTP;
import org.springframework.web.multipart.MultipartFile;
import lombok.extern.slf4j.Slf4j;


@Slf4j
public class HttpMultiPartFileUtil {
    public static Map<String, String> httpPostRequest(String url, String fileParName,
                                                       Map<String, Object> params, int timeout) {
        Map<String, String> resultMap = new HashMap<String, String>();
        CloseableHttpClient httpClient = HttpClients.createDefault();
        String result = "";
        try {
            HttpPost httpPost = new HttpPost(url);
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.setCharset(java.nio.charset.Charset.forName("UTF-8"));
            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
            List<MultipartFile> multipartFiles = (List<MultipartFile>)params.get("multiFiles");
            params.remove("multiFiles");
            String fileName = null;
            MultipartFile multipartFile = null;
            for (int i = 0; i < multipartFiles.size(); i++) {
                multipartFile = multipartFiles.get(i);
                fileName = multipartFile.getOriginalFilename();
                builder.addBinaryBody(fileParName, multipartFile.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);// 檔案流
            }
            //決中文亂碼
            ContentType contentType = ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                if(entry.getValue() == null)
                    continue;
                // 類似瀏覽器表單提交,對應input的name和value
                builder.addTextBody(entry.getKey(), entry.getValue().toString(), contentType);
            }
            HttpEntity entity = builder.build();
            httpPost.setEntity(entity);
            HttpResponse response = httpClient.execute(httpPost);// 執行提交

            // 設定連線超時時間
            RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout)
                    .setConnectionRequestTimeout(timeout).setSocketTimeout(timeout).build();
            httpPost.setConfig(requestConfig);

            HttpEntity responseEntity = response.getEntity();
            
            resultMap.put("code", String.valueOf(response.getStatusLine().getStatusCode()));
            resultMap.put("data", IOUtils.toString(responseEntity.getContent()));
            
        } catch (Exception e) {
            resultMap.put("code", "error");
            resultMap.put("data", "HTTP請求出現異常: " + e.getMessage());

            Writer w = new StringWriter();
            e.printStackTrace(new PrintWriter(w));
            log.error("HTTP請求出現異常: " + w.toString());
        } finally {
            try {
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return resultMap;
    }
}

參考:https://blog.csdn.net/u010826617/article/details/80236226