如何实现把文件流(或字节数组)从一个接口传到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;
/**
资源上传
*/
@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");
}
}