通过调servlet接口,上传文件数据

用下图方式,把 文件流转成字节数组之后,用MultipartEntityBuilder传到接口,接口
处如何接收文件数据,request.getParameter("filedata")接收是null,哪位接触过这种
文件上传的方法或者有其他好的上传文件数据的方法,求指点
图片说明

试试看contenttype用下面代替
ContentType.create("text/plain", Charset.forName(this.charset))
参考:http://blog.csdn.net/zhouzme/article/details/18940279

不需要再将文件流转成字节。直接对文件流就可以处理
接口在接到请求的时候

    @RequestMapping("/upload")
    public void uploadFile(HttpServletRequest request){
        List<String> filePaths = new ArrayList<>();
        MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
        List<MultipartFile> files = multiRequest.getFiles("file");
        for (MultipartFile file : files) {
            String ora = file.getOriginalFilename();
            String filePath = "D:\\upload\\" + ora;
            FileUtil.createDir(dir + dirName);
            file.transferTo(new File(filePath));
            filePaths.add(filePath);
        }
    }

文件在上传的时候参数名我这面用的是 multiRequest.getFiles("file");
你把file换成你的参数名就可以了。
这是我现在使用的后台接收文件的接口
filePaths是一个String数组,时服务器保存的图片路径

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>


Servlet3.0实现文件上传




上传单个文件

<!-- 文件上传时必须要设置表单的enctype="multipart/form-data"-->
method="post" enctype="multipart/form-data">
上传文件:










上传多个文件

<!-- 文件上传时必须要设置表单的enctype="multipart/form-data"-->
method="post" enctype="multipart/form-data">
上传文件:



上传文件:







1、使用注解@MultipartConfig将一个Servlet标识为支持文件上传。

2、Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。

package me.gacl.web.controller;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

//使用@WebServlet配置UploadServlet的访问路径
@WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")
//使用注解@MultipartConfig将一个Servlet标识为支持文件上传
@MultipartConfig//标识Servlet支持文件上传
public class UploadServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
         request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //存储路径
        String savePath = request.getServletContext().getRealPath("/WEB-INF/uploadFile");
        //获取上传的文件集合
        Collection<Part> parts = request.getParts();
        //上传单个文件
        if (parts.size()==1) {
             //Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。
            //Part part = parts[0];//从上传的文件集合中获取Part对象
            Part part = request.getPart("file");//通过表单file控件(<input type="file" name="file">)的名字直接获取Part对象
            //Servlet3没有提供直接获取文件名的方法,需要从请求头中解析出来
            //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"
            String header = part.getHeader("content-disposition");
            //获取文件名
            String fileName = getFileName(header);
            //把文件写到指定路径
            part.write(savePath+File.separator+fileName);
        }else {
            //一次性上传多个文件
            for (Part part : parts) {//循环处理上传的文件
                //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"
                String header = part.getHeader("content-disposition");
                //获取文件名
                String fileName = getFileName(header);
                //把文件写到指定路径
                part.write(savePath+File.separator+fileName);
            }
        }
        PrintWriter out = response.getWriter();
        out.println("上传成功");
        out.flush();
        out.close();
}

 /**
 * 根据请求头解析出文件名
 * 请求头的格式:火狐和google浏览器下:form-data; name="file"; filename="snmp4j--api.zip"
 *                 IE浏览器下:form-data; name="file"; filename="E:\snmp4j--api.zip"
 * @param header 请求头
 * @return 文件名
 */
public String getFileName(String header) {
    /**
     * String[] tempArr1 = header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别
     * 火狐或者google浏览器下:tempArr1={form-data,name="file",filename="snmp4j--api.zip"}
     * IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}
     */
    String[] tempArr1 = header.split(";");
    /**
     *火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}
     *IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}
     */
    String[] tempArr2 = tempArr1[2].split("=");
    //获取文件名,兼容各种浏览器的写法
    String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\")+1).replaceAll("\"", "");
    return fileName;
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    this.doGet(request, response);
}

}

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;

import com.taxi.Constant;
import com.taxi.jdbc.dao.HelpDao;
import com.taxi.jdbc.dao.base.UploadDao;
import com.taxi.jdbc.dao.bean.UpLoadBean;
import com.taxi.jdbc.dao.imp.UploadDaoImp;
import com.taxi.util.Commend;

/**

  • @author lolin
  •     资源上传
    

    */
    @WebServlet(name = "Upload", urlPatterns = "/Upload")
    public class ResourceUpload extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    response.reset();// 清空输出流
    response.setContentType("text/html");
    response.setCharacterEncoding(Commend.UTF8);
    System.out.println("开始上传");
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    if (!isMultipart) {
    throw new RuntimeException("your form is not multipart/form-data");
    }
    Connection conn = null;
    try {
    conn = HelpDao.getInstance().getConnection();
    UploadDao uploadDB = new UploadDaoImp(conn);
    String root_path = "E:/resource";
    // 设置文件大小位置等等
    DiskFileItemFactory diskfactory = new DiskFileItemFactory();
    // 指定临时文件的存储目录
    // diskfactory.setRepository(new File("path"));
    // 核心类处理上传逻辑
    ServletFileUpload fileUpload = new ServletFileUpload(diskfactory);

        // 解决表单乱码
        fileUpload.setHeaderEncoding("utf-8");
        // 进度条
        fileUpload.setProgressListener(new ProgressListener() {
            @Override
            public void update(long pBytesRead, long pContentLength,
                    int pItems) {
    
                if (pContentLength == -1) {
                    System.out.println("文件错误");
                } else {
                    float percent = (float) (pBytesRead * 1.0
                            / pContentLength * 100);
                    int percents = (int) percent;
                    System.out.println("已完成: " + percents + "%");
                }
            }
        });
    
        // fileUpload.setFileSizeMax(1024*1024*3); //单个文件不能超过3M
        // fileUpload.setSizeMax(1024*1024*6);//总上传文件不能超过6M
    
        List<FileItem> listItem = fileUpload.parseRequest(request);
        StringBuffer uuid_sb = new StringBuffer();
        for (FileItem item : listItem) {
            if (item.isFormField()) {
                // 普通文本input
                processFormField(item);
            } else {
                // 文件上传
                if (item.getName() != null && !item.getName().equals("")) {
                    // 扩展名
                    String separator = FilenameUtils.getExtension(item.getName());
                    String directory = root_path + File.separator + separator;
                String absolutePath =   processFileUpload(item, directory);
                String uuid =uploadDB.insert(absolutePath,(int)item.getSize());
                uuid_sb.append(uuid);
                uuid_sb.append(",");
                } else {
                    System.out.println("没有提交文件");
                }
    
            }
        }
        String result =uuid_sb.toString().substring(0, uuid_sb.length()-1);
        response.getWriter().write(result);
    
    } catch (FileUploadException e) {
        e.printStackTrace();
        response.sendError(500);
    } catch (SQLException e1) {
        e1.printStackTrace();
        response.sendError(500);
    } catch (Exception e2){
        e2.printStackTrace();
        response.sendError(500);
    }finally {
        HelpDao.getInstance().closeConn(conn);
    }
    

    }

    // 普通input
    private void processFormField(FileItem item) {
    try {
    System.out.println("普通文件" + item.getFieldName() + " "
    + item.getString("utf-8"));
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }

    }

    // 上传文件
    private String processFileUpload(FileItem item, String path)
    throws Exception {
    String filename = item.getName();
    System.out.println("上传的文件名" + filename);
    if (filename != null) {
    filename = FilenameUtils.getName(filename);
    }
    // 解决重名问题
    filename = Constant.sdf.format(new Date()) + "_" + filename;

    File dirctoryFile = new File(path);
    
    // 按照日期进行打算存储目录
    File newFileDir = makeChildDirectory(dirctoryFile);
    
    if (!newFileDir.exists()) {
        newFileDir.mkdirs();
    }
    // 用文件名的hashCode计算打散的存储目录:二级目录
    // File newFileDir = makeChildDirctory(dirctoryFile,filename);
    File file = new File(newFileDir, filename);
    

// file.createNewFile();
item.write(file);
// 删除临时文件
item.delete();
return file.getAbsolutePath();
}

/**
 * 按照日期打散目录
 * 
 * @param storeDirectroy
 * @return
 */
private File makeChildDirectory(File storeDirectroy) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    String dateDir = sdf.format(new Date());
    File file = new File(storeDirectroy, dateDir);
    if (!file.exists()) {
        file.mkdirs();
    }
    return file;
}


protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}

}

https://www.suancaiyu.xyz/read/2463.html

参考。

头部"multipart/form-data"这个要被指定,才可以

public static boolean upload(File file, String uri) {
try {
URL upDataPhoto = new URL(uri);
HttpURLConnection http = (HttpURLConnection) upDataPhoto.openConnection();
String BOUNDARY = "---------7d4a6d158c9"; // 定义数据分隔线
//上传图片的一些参数设置
http.setDoOutput(true);
http.setUseCaches(true);
http.setRequestProperty("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, application/x-quickviewplus, /");
http.setRequestProperty("Accept-Language", "zh-cn");
http.setRequestMethod("POST");
http.setRequestProperty("Accept-Encoding", "gzip, deflate");
http.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
http.setRequestProperty("Connection", "Keep-Alive");
http.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

        OutputStream out = new DataOutputStream(http.getOutputStream());
        byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();// 定义最后数据分隔线

// int leng = list.size();
// for (int i = 0; i < leng; i++) {
// String fname = list.get(i);
// File file = new File(fname);
StringBuilder sb = new StringBuilder();
sb.append("--");
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data;name=\"file" + "\";filename=\"" + file.getName() + "\"\r\n");
// sb.append("Content-Disposition: form-data;userId=\"" + IQClassGlobalManager.cloudUserInfo.studentId+ "\";filename=\"" + file.getName() + "\"\r\n");
sb.append("Content-Type:image/*" + "\r\n\r\n");

        byte[] data = sb.toString().getBytes();
        out.write(data);

// StringBuilder sb1 = new StringBuilder();
// sb1.append("--");
// sb1.append(BOUNDARY);
// sb1.append("\r\n");
// sb1.append("Content-Disposition: form-data;name=\"student" + "\";filename=\"" +IQClassGlobalManager.cloudUserInfo.studentId + "\"\r\n");
// sb1.append("Content-Type:application/octet-stream" + "\r\n\r\n");
// byte[] data1 = sb1.toString().getBytes();
// out.write(data1);

        DataInputStream in = new DataInputStream(new FileInputStream(file));
        int bytes = 0;
        byte[] bufferOut = new byte[1024];
        while ((bytes = in.read(bufferOut)) != -1) {
            out.write(bufferOut, 0, bytes);
        }
        out.write("\r\n".getBytes()); //多个文件时,二个文件之间加入这个
        in.close();

// }
out.write(end_data);
out.flush();
out.close();

        // 定义BufferedReader输入流来读取URL的响应
        BufferedReader reader = new BufferedReader(new InputStreamReader(http.getInputStream()));
        String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }

    } catch (Exception e) {
        System.out.println("发送POST请求出现异常!" + e);
        e.printStackTrace();
        return false;
    }

    return true;
}