java上传文件到servlet接口

如何实现把文件流(或字节数组)从一个接口传到servlet接口,使用post方式提交,
文件流(或字节数组)有可能较大,在servlet中如何接收到文件流。在线急等

搜下fileupload

使用文件上传接口;post字符串,tomcat会限制长度

直接使用post上传到服务器

//将request变成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
//获取multiRequest 中所有的文件名
Iterator iter = multiRequest.getFileNames();
while (iter.hasNext()) {
docFileId = docFileService.getDocumentId();
picId = docFileService.getFoodPictureId();
//一次遍历所有文件
MultipartFile file = multiRequest.getFile(iter.next().toString());

使用文件上传接口;post字符串,tomcat会限制长度。直接使用post上传到服务器

1、重载 HttpServlet 中的 doPost 方法。
2、调用 request.getContentLength() 得到 Content-Length ,并定义一个与 Content-Length 大小相等的字节数组buffer。
3、从HttpServletRequest 的实例 request 中得到一个 InputStream, 并把它读入 buffer 中。
4、使用用 FileOutputStream 将 buffer 写入指定文件。

response.setContentType("application/文件类型");
response.setHeader("Content-Disposition","attachment; filename=\"文件名\"");
ServletOutputStream out = response.getOutputStream();
out.write(内容);

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.cnblogs.com/elleniou/archive/2012/09/24/2700583.html

我的理解是,你要上传一个文件到对方给定的路径下,上传方法对方已经做好了,按照你说的是servlet方法,我接触过的是如果你要从一个系统的接口调用另一个系统的接口,这是属于系统间调用的问题。
可以采用的方法有很多,最直接的就是使用httpclient和webservice,或者jdk自带的rpc调用。

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

采用Servlet3.0的@MultipartConfig标签。发送方采用multipart/form-data

格式。接收的代码我给你列出来,关键步骤有注释

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

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

import com.sun.xml.internal.ws.util.ByteArrayBuffer;


@MultipartConfig(location="./", maxFileSize = 1024*1024*20)
public class upfile extends HttpServlet{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;


          //获取注解中设置的值
          private static MultipartConfig config
              = upfile.class.getAnnotation(MultipartConfig.class);
          public upfile() {
              // TODO Auto-generated constructor stub
          }
          public void doPost(HttpServletRequest request,
                  HttpServletResponse response) throws ServletException, IOException{
              request.setCharacterEncoding("UTF-8");
              Collection<Part> list =  request.getParts();
              PrintWriter out = response.getWriter();
              response.setContentType("text/html;charset=UTF-8");

              for(Part part:list){
                  String header = part.getHeader("Content-Disposition");
                  if(header.indexOf("filename")==-1)
                      continue ;
                  String fileName = header.substring(header.indexOf("filename=\"")+10,
                  header.lastIndexOf("\""));//获得上传的文件名,没有判断用户没有选择文件直接提交的情况,没有判断上传文件失败的情况
                  if("bg".equals(part.getName())||"head".equals(part.getName())){
                  //为了避免文件重名,将时间组合到了文件名中。实际项目中可以考虑使用用户主键或者生成一个唯一的ID来组合文件名。
                      String saveName =  fileName;
                      part.write(request.getSession().getServletContext().getRealPath("/")+"img/"+saveName);//将上传的文件保存到磁盘,默认是注解中location的相对地址,也可以传入一个绝对路径
                  }else{

                  }
              }
              out.println("ok");
    }

}