5.API中的文件上传与接收

来源:互联网 发布:刷手淘宝号 编辑:程序博客网 时间:2024/06/05 20:20

0.需求

通过Java代码完成带有文件的http请求,并且服务端能接收(基于SSM)

1.SpringMVC配置文件

注释掉文件解析器,否则会引起冲突
(代码待优化)

<!-- 上传文件的解析器 -->    <!-- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        设置上传文件的最大内存        <property name="maxUploadSize" value="10240000"></property>    </bean> -->

2.客户端

import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.SocketTimeoutException;import java.net.URL;import java.net.URLEncoder;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;import javax.imageio.ImageIO;import javax.imageio.ImageReader;import javax.imageio.stream.ImageInputStream;public class HttpPostUtil {    URL url;    HttpURLConnection conn;    String boundary = "--------httppost123";    Map<String, String> textParams = new HashMap<String, String>();    Map<String, File> fileparams = new HashMap<String, File>();    DataOutputStream ds;    public HttpPostUtil(String url) throws Exception {        this.url = new URL(url);    }    // 重新设置要请求的服务器地址,即上传文件的地址。    public void setUrl(String url) throws Exception {        this.url = new URL(url);    }    // 增加一个普通字符串数据到form表单数据中    public void addTextParameter(String name, String value) {        textParams.put(name, value);    }    // 增加一个文件到form表单数据中    public void addFileParameter(String name, File value) {        fileparams.put(name, value);    }    // 清空所有已添加的form表单数据    public void clearAllParameters() {        textParams.clear();        fileparams.clear();    }    // 发送数据到服务器,返回一个字节包含服务器的返回结果的数组    public byte[] send() throws Exception {        initConnection();        try {            conn.connect();        } catch (SocketTimeoutException e) {            // something            throw new RuntimeException();        }        ds = new DataOutputStream(conn.getOutputStream());        writeFileParams();        writeStringParams();        paramsEnd();        InputStream in = conn.getInputStream();        ByteArrayOutputStream out = new ByteArrayOutputStream();        int b;        while ((b = in.read()) != -1) {            out.write(b);        }        conn.disconnect();        return out.toByteArray();    }    // 文件上传的connection的一些必须设置    private void initConnection() throws Exception {        conn = (HttpURLConnection) this.url.openConnection();        conn.setDoOutput(true);        conn.setUseCaches(false);        conn.setConnectTimeout(10000); // 连接超时为10秒        conn.setRequestMethod("POST");        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);        conn.setRequestProperty("connection", "Keep-Alive");        conn.setRequestProperty("Charsert", "UTF-8");        conn.setRequestProperty("Accept-Charset", "UTF-8");    }    // 普通字符串数据    private void writeStringParams() throws Exception {        Set<String> keySet = textParams.keySet();        for (Iterator<String> it = keySet.iterator(); it.hasNext();) {            String name = it.next();            String value = textParams.get(name);            ds.writeBytes("--" + boundary + "\r\n");            ds.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"\r\n");            ds.writeBytes("\r\n");            ds.writeBytes(encode(value) + "\r\n");        }    }    // 文件数据    private void writeFileParams() throws Exception {        Set<String> keySet = fileparams.keySet();        for (Iterator<String> it = keySet.iterator(); it.hasNext();) {            String name = it.next();            File value = fileparams.get(name);            ds.writeBytes("--" + boundary + "\r\n");            ds.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"; filename=\"" + encode(value.getName())                    + "\"\r\n");            ds.writeBytes("Content-Type: " + getContentType(value) + "\r\n");            ds.writeBytes("\r\n");            ds.write(getBytes(value));            ds.writeBytes("\r\n");        }    }    // 获取文件的上传类型,图片格式为image/png,image/jpg等。非图片为application/octet-stream    private String getContentType(File f) throws Exception {        // return "application/octet-stream"; //        // 此行不再细分是否为图片,全部作为application/octet-stream 类型        ImageInputStream imagein = ImageIO.createImageInputStream(f);        if (imagein == null) {            return "application/octet-stream";        }        Iterator<ImageReader> it = ImageIO.getImageReaders(imagein);        if (!it.hasNext()) {            imagein.close();            return "application/octet-stream";        }        imagein.close();        return "image/" + it.next().getFormatName().toLowerCase();// 将FormatName返回的值转换成小写,默认为大写    }    // 把文件转换成字节数组    private byte[] getBytes(File f) throws Exception {        FileInputStream in = new FileInputStream(f);        ByteArrayOutputStream out = new ByteArrayOutputStream();        byte[] b = new byte[1024];        int n;        while ((n = in.read(b)) != -1) {            out.write(b, 0, n);        }        in.close();        return out.toByteArray();    }    // 添加结尾数据    private void paramsEnd() throws Exception {        ds.writeBytes("--" + boundary + "--" + "\r\n");        ds.writeBytes("\r\n");    }    // 对包含中文的字符串进行转码,此为UTF-8。服务器那边要进行一次解码    private String encode(String value) throws Exception {        return URLEncoder.encode(value, "UTF-8");    }    public static void main(String[] args) throws Exception {        HttpPostUtil u = new HttpPostUtil("http://127.0.0.1:8080/SaveCoreData/receiveData");        u.addFileParameter("testTXT", new File("C:\\Users\\dell\\Desktop\\hello.txt"));        u.addTextParameter("text", "中文");        byte[] b = u.send();        String result = new String(b);        System.out.println(result);    }}

3.服务端

@RequestMapping(value = "/receiveData")public void receiveData(HttpServletRequest request, HttpServletResponse response) throws Exception {    String tempPath = request.getServletContext().getRealPath("/temp");    DiskFileItemFactory factory = new DiskFileItemFactory();    factory.setSizeThreshold(1024*1024*1024);//设置缓存大小    factory.setRepository(new File(tempPath));//默认情况下 临时文件不会自动删除    ServletFileUpload upload = new ServletFileUpload(factory);    List<FileItem> parseRequest = upload.parseRequest(request);    for (FileItem item : parseRequest) {        boolean formField = item.isFormField();        if (formField) {            String fieldName = item.getFieldName();            String value = item.getString();            value = new String(value.getBytes("iso-8859-1"), "utf-8");            System.out.println(fieldName+"----"+value);        } else {            item.delete();            String fileName = item.getName();            fileName = FileUploadUtils.getRealName(fileName);            String randomDir = FileUploadUtils.getRandomDir(fileName);            String dirPath = null;            //客服上传的附件            dirPath = "/var/upload/servicer" + randomDir;            File file = new File(dirPath);            if (!file.exists()) {                file.mkdirs();            }            InputStream in = item.getInputStream();            OutputStream out = new FileOutputStream(dirPath + "/" + fileName);            //拷贝的代码            IOUtils.copy(in, out);            in.close();            out.close();            //item删除临时文件的方法        }    }}