java fileupload上传附件到服务器,可携带参数(简单易用)可跨域,看这篇就够了

article/2025/8/28 20:42:49

一个很简单实用的上传附件实例

首先主要用到的包:

 

先看服务端代码,我这里是用了Servlet,在web.xml配置

    <servlet><servlet-class>com.file.FileEntryServlet</servlet-class><servlet-name>FileServlet</servlet-name></servlet><servlet-mapping><servlet-name>FileServlet</servlet-name><url-pattern>/fileEntry</url-pattern></servlet-mapping>

看服务端完整代码:

package com.file;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;import javax.servlet.ServletException;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;@SuppressWarnings("serial")
public class FileEntryServlet extends HttpServlet
{@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{doPost(request, response);}@Override@SuppressWarnings("unchecked")public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{int state = 0;DiskFileItemFactory factory = new DiskFileItemFactory();factory.setSizeThreshold(4096);request.setCharacterEncoding("GBK");response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();ServletFileUpload upload = new ServletFileUpload(factory);upload.setSizeMax(1024 * 1024 * 10);//上传文件流try{String a = "";String b = "";HashMap fileMap = new HashMap();boolean isMultipart = ServletFileUpload.isMultipartContent(request);if (isMultipart){try{List items = upload.parseRequest(request);Iterator iter = items.iterator();while (iter.hasNext()){FileItem item = (FileItem) iter.next();if (item.isFormField()){//普通文本信息处理   String paramName = item.getFieldName();String paramValue = item.getString();if ("a".equals(paramName))a = paramValue;else if ("b".equals(paramName))b = paramValue;}else{//上传文件信息处理   String fileName = item.getName();// String fileExt = this.getFileExt(fileName);String path = "/filetest";InputStream is = item.getInputStream();FileOutputStream fos = new FileOutputStream(path+"/"+ fileName);int index = 0;while((index=is.read())!=-1){fos.write(index);}is.close();fos.close();item.delete();//处理自己的业务System.out.println("a=="+a);System.out.println("b=="+b);//设置成功state=1;}}}catch (FileUploadException e){e.printStackTrace();}}if (state > 0)out.write("{'result':'true','message':'上传成功'}");out.flush();}catch (Exception e){//out.write("0");out.write("{'result':'false','message':'文件上传出现未知错误!'}");out.flush();out.close();//释放IO资源}}/*** 获取后缀名* @param vo*/private String getFileExt(String fileName) throws Exception{String value = new String();int start = 0;int end = 0;if (fileName == null)return null;start = fileName.lastIndexOf('.') + 1;end = fileName.length();value = fileName.substring(start, end);if (fileName.lastIndexOf('.') > 0)return value;elsereturn "";}
}

其中处理文本信息的代码:

处理附件的代码:

 

接下来是客户端调用代码:

package com.file;import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;public class FileUpLoadUtil
{/*** 通过拼接的方式构造请求内容,实现参数传输以及文件传输* @param actionUrl 访问的服务器URL* @param params 普通参数* @param files 文件参数* @return* @throws IOException*/public static String post(String actionUrl, Map<String, String> params, String[] filePathList) throws IOException{String BOUNDARY = java.util.UUID.randomUUID().toString();String PREFIX = "--", LINEND = "\r\n";String MULTIPART_FROM_DATA = "multipart/form-data";String CHARSET = "UTF-8";String result = "";URL uri = new URL(actionUrl);HttpURLConnection conn = (HttpURLConnection) uri.openConnection();conn.setReadTimeout(10 * 1000); // 缓存的最长时间conn.setDoInput(true);// 允许输入conn.setDoOutput(true);// 允许输出conn.setUseCaches(false); // 不允许使用缓存conn.setRequestMethod("POST");conn.setRequestProperty("connection", "keep-alive");conn.setRequestProperty("Charsert", CHARSET);conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);// 首先组拼文本类型的参数StringBuilder sb = new StringBuilder();for (Map.Entry<String, String> entry : params.entrySet()){sb.append(PREFIX);sb.append(BOUNDARY);sb.append(LINEND);sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);sb.append("Content-Transfer-Encoding: 8bit" + LINEND);sb.append(LINEND);sb.append(entry.getValue());sb.append(LINEND);}DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());outStream.write(sb.toString().getBytes());// 发送文件数据   if (filePathList != null){for (String filePath : filePathList){File file = new File(filePath);StringBuilder sb1 = new StringBuilder();sb1.append(PREFIX);sb1.append(BOUNDARY);sb1.append(LINEND);sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"" + LINEND);sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND);sb1.append(LINEND);outStream.write(sb1.toString().getBytes());InputStream is = new FileInputStream(file);byte[] buffer = new byte[1024 * 3];int len = 0;while ((len = is.read(buffer)) != -1){outStream.write(buffer, 0, len);}is.close();outStream.write(LINEND.getBytes());}}//请求结束标志  byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();outStream.write(end_data);outStream.flush();int responseCode = conn.getResponseCode();if (HttpURLConnection.HTTP_OK == responseCode){StringBuffer returnInfo = new StringBuffer();String readLine;BufferedReader responseReader;responseReader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));while ((readLine = responseReader.readLine()) != null){returnInfo.append(readLine).append("\n");}result = returnInfo.toString();responseReader.close();}return result;}public static void main(String[] args) throws Exception{String actionUrl = "http://localhost:8080/yszdServer/fileEntry";Map<String, String> params = new HashMap<String, String>();
//     参数params.put("a", "hahaha");params.put("b", "你好啊");//文件路径String[]支持多个String[] filePathList = { "d:\\123.txt" };//上传文件的路径String returns = FileUpLoadUtil.post(actionUrl, params, filePathList);System.out.println("服务端返回>>>" + returns);}
}

测试部分:

图中的3块分别传入“地址”“文本参数”“附件”,右键执行这个代码,服务打印出传入的参数a和b,如图:

同时也在指定的目录下生成了附件

很简单方便,拿过去就可以调试使用,欢迎指正!!

 


http://chatgpt.dhexx.cn/article/v54oPV15.shtml

相关文章

公众号的附件怎么上传(如Word、Excel、Pdf等)

公众号我们都接触过&#xff0c;有企业的、有单位的、有个人的&#xff0c;公众号主要用来发布文章和消息&#xff0c;可以提供企业单位的对外沟通&#xff0c;提升企业单位的形象。 随着公众号的日益强大&#xff0c;我们也可以利用公众号对外发布招聘、重大消息公示、资料收…

网络安全实验之《VPN》实验报告

一、实验目的 (1)课上实验&#xff1a; 1.在Windows中配置&#xff08;内置或者专有&#xff09;IPSec。 2.通过抓包工具抓取建立IPSec的协商密钥过程&#xff0c;和建立之后的加密通信数据包&#xff0c;并进行分析。 (2)课后实验&#xff1a; 1.配置Cisco Packet Tracer…

课程实验三-bomb实验

实验题目&#xff1a; 程序运行在linux环境中。程序运行中有6个关卡&#xff08;6个phase&#xff09;&#xff0c;每个phase需要用户在终端上输入特定的字符或者数字才能通关&#xff0c;否则会引爆炸弹&#xff01;需要使用gdb工具反汇编出汇编代码&#xff0c;结合c语言文件…

cachelab实验

计算机系统原理实验日志 一、实验内容 1、编写一个C程序&#xff08;csim.c&#xff0c;大约200-300行&#xff09;&#xff0c;用于模拟Cache的行为。 2、已提供一个参考的cache模拟器(可执行文件csim-ref)&#xff0c;目标是自己写的 csim和参考的csim-ref行为一致&#…

认真一点!-实验吧

这个题其实是个布尔盲注题&#xff0c;怎么说&#xff0c;正常是you are in&#xff0c;报错是you are not in&#xff0c;触发waf是sql injection detected 然后fuzz一下&#xff0c;图我就不贴了&#xff0c;做的时候忘了截下图 结果大概是过滤了and&#xff0c;空格&#…

Lab1实验分享

文章目录 一.内核的物理位置二.Bootloader三.编译和链接四.va_list、va_start和va_end三个宏的用法。五.ELF文件的结构六.lp_Print()函数流程图 一.内核的物理位置 操作系统最重要的部分是操作系统内核&#xff0c;因为内核需要直接与硬件交互管理各个硬件&#xff0c;从而利用…

CSAPP实验二——bomb lab实验

CSAPP实验二—— bomb lab实验 实验前准备第一部分&#xff08;phase_1&#xff09;第二部分&#xff08;phase_2&#xff09;第三部分&#xff08;phase_3&#xff09;第四部分&#xff08;phase_4)第五部分&#xff08;phase_5&#xff09;第六部分&#xff08;phase_6&#…

Attacklab实验

一、实验目的 1、深入了解缓冲区溢出的隐患&#xff0c;了解如何利用缓冲区溢出这个漏洞对现有程序进行控制流劫持、执行非法程序代码&#xff0c;从而造成对程序进行攻击以及破坏的过程&#xff1b; 2、增强对程序机器级表示、汇编语言、调试器和逆向工程等理解。 二、实验…

计算机系统基础实验-LinkLab实验

这是大三时的实验课&#xff0c;很久以前的东西&#xff0c;应要求放出来&#xff0c;做的不是很好。linux永远都是很重要的&#xff0c;希望我和大家都记得这个。实际上做到第五阶段我就不会了。 实验课程名称&#xff1a;计算机系统基础 实验项目名称&#xff1a;LinkLab实…

Lab5实验分享

文章目录 一.全局变量名词解释二.实验难点图示1.文件系统层次关系梳理2.多级目录与多级索引 三.代码梳理1.磁盘管理2.文件系统3.用户接口4.文件服务 一.全局变量名词解释 #define NBLOCK 1024 //一块磁盘里面的block数目 uint32_t nbitblock; // 用于存储bitmap的block数目 ui…

实验.......

第一步配置ip与环回地址 做hub&spoken的fullmesh结构以r2为例 其他路由同样操作 要求使用rip协议&#xff0c;以r2为例

实验吧——WEB-认真一点!

认真一点&#xff01; 打开链接&#xff0c;看到这个页面&#xff0c;第一反应又是sql注入 翻翻源码没有任何提示 打开burp开始抓包&#xff0c;包头与返回头又没有任何提示&#xff0c;试着开始修改ID 的值&#xff0c;观察页面变化。 提交1或用语句让框内为真&#xff0c;显…

实验....

实验要求 r1代表运营商 r1远程登录r2实际登陆r9 r3访问r7的换回地址走r5 全网可达 1.全网可达 配置ip 2配置rip协议&#xff0c;r8r9用v1其余用v2 3让r8r9接入内网&#xff0c;在r8对端接口写入v2 r3访问r7的换回地址走r5 r1代表运营商 r1远程登录r2实际登陆r9 先打开r…

实验吧 认真一点!

真的很久很久没碰过这个玩意了&#xff0c;真是不会了&#xff0c;而且这个题目本身就不是很容易&#xff0c;搞得我也是满肚子邪火&#xff0c;很气。这个题目主要难在它吧过滤和ban结合到了一起了。我们还是先看题目,首先拿到题目看到输入id0和输入id1结果不一样&#xff0c;…

让我进去-实验吧

这题做的真的是久&#xff0c;莓办法&#xff0c;太菜了 进去看见cookie有个source值很奇怪&#xff0c;把他改成1试一下就收到这段代码 $flag "XXXXXXXXXXXXXXXXXXXXXXX"; $secret "XXXXXXXXXXXXXXX"; // This secret is 15 characters long for secu…

实验吧

1.变异凯撒 把flag转化为ascii码&#xff0c;加密密文转化为ascii码&#xff0c; 因为是凯撒加密&#xff0c;所以思考移动的位数&#xff0c;分别是加了5&#xff0c;6&#xff0c;7&#xff0c;8.。。。 所以移动的位次是从5递加 得到结果 ascii码值转化&#xff0c;得到flag…

[大学物理实验-5]波尔共振实验

[大学物理实验-5]波尔共振实验 前言实验预习&#xff08;Preview&#xff09;实验报告&#xff08;Report&#xff09;实验报告&#xff08;Report&#xff09;总结&#xff08;Sum up&#xff09; 前言 最近在整理一些学过的课程的资料&#xff0c;有一些课虽然和我的专业毫无…

实验一-Bomblab(炸弹实验)

实验概述&#xff1a;该实验就是通过分析汇编代码&#xff0c;并使用GDB调试&#xff0c;找到每一题的通关钥匙 第一关&#xff1a;&#xff08;key“He is evil and fits easily into most overhead storage bins.”&#xff09; 简单解析&#xff1a;比…

实验.........

首先配置ip地址和环回地址 以r1为例 先用ospf联通r2r3r4r5r6r7 以r2为例 r1启bgp与r2建邻 r2r3r4r5r6r7同理建邻居 这里以r2为例 r7r8建邻方法同r1r2 优化在r2上

实验........

实验....... 先配置ip地址以r2为例 然后配置rip同样以r2为例 启用bgp建立对等体&#xff0c;需要书写as号 以r1与r3为例 建立ebgp 以r3r4为例 r3 r4 建立换回&#xff0c;以环回为对等提