nodejs 处理post文件数据 模拟上传

本文介绍了一个使用Node.js处理HTTP文件上传的示例,通过手动解析multipart/form-data格式的请求体来提取上传的文件和表单数据,同时展示了如何使用multiparty库简化这一过程。

首先利用http创建一个server,监听到8080端口,之后我们可以打印req.headers查看headers的内容,post的数据

格式一般为:

------WebKitFormBoundaryLIXOJt36aIHyhrvq
Content-Disposition: form-data; name="username"

1
------WebKitFormBoundaryLIXOJt36aIHyhrvq
Content-Disposition: form-data; name="password"

1
------WebKitFormBoundaryLIXOJt36aIHyhrvq
Content-Disposition: form-data; name="f1"; filename="aaa.txt"
Content-Type: text/plain

abcd
1234
------WebKitFormBoundaryLIXOJt36aIHyhrvq--

利用该格式处理出我们需要的数据,都是一些字符以及二进制操作。

 

server.js

const http=require('http');
const util=require('buffer_util');
const fs=require('fs');

http.createServer((req, res)=>{
	let arr=[];
	console.log(req.headers);
	let boundary='--'+req.headers['content-type'].split('; ')[1].split('=')[1];
	console.log(boundary);


	req.on('data',buffer=>{
		arr.push(buffer);
	});
	req.on('end',()=>{
		let buffer=Buffer.concat(arr);
		console.log('最初'+buffer);
		let arr2=util.bufferSplit(buffer,boundary);

		arr2.pop();
		arr2.shift();

		arr2.forEach(buffer=>{
			console.log('原始'+buffer.toString());
			buffer=buffer.slice(2,buffer.length-2);


			let n=buffer.indexOf('\r\n\r\n');
			let info=buffer.slice(0,n).toString();
			let data2=buffer.slice(n+4,buffer.length);
			// console.log('--'+info);
			// console.log('-'+data2);
			if(info.indexOf('\r\n')!=-1){//文件信息
				let res2 = info.split('\r\n')[0].split('; ');
				let name = res2[1].split('=')[1];
				let filename = res2[2].split('=')[1];

				name=name.substring(1,name.length-1);
				filename=filename.substring(1,filename.length-1);

				console.log('&&&&&'+name, filename+'&&&&&&&&');
				fs.writeFile(`upload/${filename}`,data2,err=>{
					if(err){
						console.log(err);
					}else {
						console.log('上传成功');
					}
				})
			}else{
				let name=info.split('; ')[1].split('=')[1];
				name=name.substring(1,name.length-1);
				console.log(name);
			}
			console.log('**'+data2.toString()+'**');
		})

		
	});
}).listen(8080);

html

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<form action="http://localhost:8080/upload" method="post" enctype="multipart/form-data"> 
	用户名:<input type="text" name="username"><br>
	密码:<input type="password" name="password"><br>
	<input type="file" name="f1">
	<input type="submit" value="提交">
	</form>
</body>
</html>

利用multiparty库解决上面的问题

const http=requrie('http');
const multiparty=requrie('multiparty');

http.createServer((req,res)=>{
	let form = new multiparty.Form({
		uploadDir: './upload'
	});

	form.parse(req);

	form.on('field',(name,value)=>{
		console.log('字段',name,value);
	});

	form.on('file',(name,file)=>{
		console.log('文件',name,file);
	});

	form.on('close',()=>{
		console.log('表单解析完成');
	})
}).listen(8080);

 

<think> 我们参考上述引用并结合Node.js的fetch API来实现模拟Postman的请求。Postman中的请求通常包含三部分:Params(查询参数)、Headers(请求头)和Body(请求体)。在Node.js中,我们可以使用fetch函数来发送请求,并分别设置这些部分。 步骤: 1. 对于Params:即URL的查询字符串(query string),我们可以手动构建URL,将参数附加在URL后面。 2. 对于Headers:我们可以在fetch的options中设置headers对象。 3. 对于Body:根据请求体的类型(如JSON、表单数据等),设置body和相应的Content-Type。 注意:在Node.js 18及以上版本中,fetch是内置模块,无需安装。如果你使用的是较低版本,可能需要安装node-fetch库。 下面是一个示例,我们将发送一个POST请求,包含Params、Headers和Body。 假设我们要请求的URL是:https://example.com/api/data Params: key1: value1 key2: value2 Headers: Authorization: Bearer token123 Content-Type: application/json Body: { "name": "John", "age": 30 } 实现代码: </think> 在 Node.js 中使用 `fetch` 模拟 Postman 请求需要处理三个核心部分:Params(查询参数)、Headers(请求头)和 Body(请求体)。以下是完整实现方法: ### 1. 基础实现代码 ```javascript const fetch = require('node-fetch'); // Node.js 18+ 可省略此导入 async function sendPostmanLikeRequest() { const url = new URL('https://api.example.com/endpoint'); // 1. 添加 Params(查询参数) const params = { key1: 'value1', key2: 'value2' }; Object.entries(params).forEach(([key, value]) => { url.searchParams.append(key, value); }); // 2. 设置 Headers const headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer your_token_here', 'Custom-Header': 'custom_value' }; // 3. 设置 Body(支持多种格式) const body = JSON.stringify({ username: 'john_doe', age: 30 }); try { const response = await fetch(url.toString(), { method: 'POST', // GET/PUT/DELETE 等 headers, body }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); console.log('Response:', data); return data; } catch (error) { console.error('Request failed:', error); } } // 执行请求 sendPostmanLikeRequest(); ``` ### 2. 关键配置说明 #### 参数处理(Params) - 使用 `URL` 对象管理查询参数 - 动态添加参数:`url.searchParams.append('param', 'value')` - 示例结果 URL:`https://api.example.com/endpoint?key1=value1&key2=value2` #### 请求头(Headers) | 头字段 | 说明 | 示例 | |--------|------|------| | `Content-Type` | 指定 Body 类型 | `application/json` | | `Authorization` | 认证令牌 | `Bearer xyz` | | `Custom-Header` | 自定义头部 | 任意值 | | `Accept` | 响应格式要求 | `application/json` | #### 请求体(Body)支持格式 ```javascript // 1. JSON(最常用) body: JSON.stringify({ key: 'value' }) // 2. FormData(文件上传) const formData = new FormData(); formData.append('file', fileBuffer, 'filename.jpg'); body: formData // 3. URL编码表单 body: new URLSearchParams({ key: 'value' }) // 4. 纯文本 body: 'raw text content' ``` ### 3. 跨域处理要点 当访问第三方 API 时需注意: 1. 服务端必须配置 CORS 头部(引用[2][5]) ```javascript // 服务端示例 res.setHeader('Access-Control-Allow-Origin', '*') res.setHeader('Access-Control-Allow-Methods', 'POST, GET') ``` 2. 客户端需处理预检请求(OPTIONS) 3. 开发环境可通过代理解决跨域(引用[3]) ### 4. 不同请求方法示例 ```javascript // GET 请求(带Params) fetch(url + '?param1=value1') // POST 请求(带Body) fetch(url, { method: 'POST', body }) // PUT/DELETE 请求 fetch(url, { method: 'PUT', body }) ``` ### 5. 常见问题解决 1. **证书错误**:添加 `agent: new https.Agent({ rejectUnauthorized: false })`(仅限开发环境) 2. **超时控制**: ```javascript const controller = new AbortController(); setTimeout(() => controller.abort(), 5000); fetch(url, { signal: controller.signal }) ``` 3. **文件上传**: ```javascript const form = new FormData(); form.append('file', fs.createReadStream('image.jpg')); fetch(url, { method: 'POST', body: form }) ``` > **提示**:Node.js 18+ 内置了 fetch API,旧版本需安装 `node-fetch@3` 包。对于复杂场景(如 cookie 管理),建议使用 [axios](https://axios-http.com/) 库替代原生 fetch[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值