用request模拟上传图片 Nodejs
用request模拟上传图片 Nodejs
在做爬虫,现在需要模拟一个上传图片的过程,通过chrome调试的network看到的请求信息如下:
如果用request模拟这个请求的话该怎么写啊?下面的写法好像不对:
request.post({
uri: url,
headers: {
'content-type' : 'application/octet-stream'
},
form: {
Filename: '2000.jpg',
FileType: 'Image',
N: 1,
F: 'MemberIDCard',
fileext: '*.jpg;*.png;*.gif',
folder: '/Transport/',
Upload: 'Submit Query'
},
body: 'http://t1.qpic.cn/mblogpic/bc65fe3404f5084b2d7e/2000.jpg'
}, function (error, response, body) {
if (!error) {
console.log(body);
}
});
如果需要上传的图片不是本地图片,是否需要将图片先下载到本地再进行上传?
要使用 request
模块来模拟上传图片,你需要正确地构造请求体,并确保文件数据被正确处理。以下是一个示例代码,展示如何通过网络 URL 获取图片并上传。
示例代码
const request = require('request');
const fs = require('fs');
const FormData = require('form-data');
// 图片URL
const imageUrl = 'http://t1.qpic.cn/mblogpic/d07059d6f9f489f9c140/2000.jpg';
// 目标上传地址
const uploadUrl = 'http://example.com/upload';
// 下载图片并保存到本地
request(imageUrl).pipe(fs.createWriteStream('temp.jpg')).on('close', () => {
// 构造FormData对象
const formData = new FormData();
formData.append('Filename', '2000.jpg');
formData.append('FileType', 'Image');
formData.append('N', 1);
formData.append('F', 'MemberIDCard');
formData.append('fileext', '*.jpg;*.png;*.gif');
formData.append('folder', '/Transport/');
formData.append('file', fs.createReadStream('temp.jpg'));
// 发送POST请求
request.post({
url: uploadUrl,
formData: formData
}, (err, httpResponse, body) => {
if (err) {
console.error(err);
} else {
console.log('Response:', body);
}
});
});
解释
-
下载图片:
- 使用
request
模块从给定的 URL 下载图片,并将其保存为临时文件temp.jpg
。 request(imageUrl).pipe(fs.createWriteStream('temp.jpg'))
将下载的数据流保存到本地文件。
- 使用
-
构造FormData对象:
- 使用
FormData
库来构建请求体。FormData
允许你以表单的形式发送数据。 formData.append
方法用于添加表单字段和文件数据。
- 使用
-
发送POST请求:
- 使用
request.post
方法发送带有formData
的 POST 请求。 - 响应结果会在回调函数中返回。
- 使用
注意事项
-
确保安装了必要的依赖库:
npm install request form-data
-
如果上传接口对文件名有特定要求或需要额外的字段,可以根据实际情况调整
formData.append
的参数。
这种方法可以有效地模拟上传图片的过程,而不需要手动处理复杂的请求头和请求体。
已解决,用needle搞定
对于你的需求,request
库可能不是最佳选择,因为它已经被废弃了。你可以使用 axios
或者 node-fetch
等现代库来处理 HTTP 请求。但为了满足你的问题,这里我将展示如何使用 axios
来模拟上传图片。
首先,你需要安装 axios
和 form-data
:
npm install axios form-data
然后,你可以使用以下代码来模拟上传图片:
const axios = require('axios');
const FormData = require('form-data');
// 下载图片并存储到本地临时文件
const fs = require('fs');
const path = require('path');
const downloadImage = async (url, dest, cb) => {
const writer = fs.createWriteStream(dest);
const response = await axios({
url,
method: 'GET',
responseType: 'stream'
});
response.data.pipe(writer);
return new Promise((resolve, reject) => {
writer.on('finish', resolve);
writer.on('error', reject);
});
};
const filePath = path.join(__dirname, 'tempImage.jpg');
await downloadImage('http://t1.qpic.cn/mblogpic/d07059d6f9f489f9c140/2000.jpg', filePath, (err) => {
if (err) {
console.error(err);
return;
}
});
// 使用axios上传文件
const formData = new FormData();
formData.append('Filename', '2000.jpg');
formData.append('FileType', 'Image');
formData.append('N', 1);
formData.append('F', 'MemberIDCard');
formData.append('fileext', '*.jpg;*.png;*.gif');
formData.append('folder', '/Transport/');
formData.append('Upload', 'Submit Query');
formData.append('file', fs.createReadStream(filePath));
axios.post('your_upload_url', formData, {
headers: formData.getHeaders()
})
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error(error);
});
在这个例子中,我们首先从网络上下载图片,并保存到本地临时文件中。然后我们使用 FormData
创建一个表单数据对象,并将图片添加到表单数据中。最后,我们使用 axios
发送带有表单数据的 POST 请求。
注意替换 'your_upload_url'
为实际的上传 URL。同时,确保你已经安装了 axios
和 form-data
包。