用request模拟上传图片 Nodejs

用request模拟上传图片 Nodejs

在做爬虫,现在需要模拟一个上传图片的过程,通过chrome调试的network看到的请求信息如下: request header request rayload 如果用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);
    }
});

如果需要上传的图片不是本地图片,是否需要将图片先下载到本地再进行上传?


3 回复

要使用 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);
        }
    });
});

解释

  1. 下载图片:

    • 使用 request 模块从给定的 URL 下载图片,并将其保存为临时文件 temp.jpg
    • request(imageUrl).pipe(fs.createWriteStream('temp.jpg')) 将下载的数据流保存到本地文件。
  2. 构造FormData对象:

    • 使用 FormData 库来构建请求体。FormData 允许你以表单的形式发送数据。
    • formData.append 方法用于添加表单字段和文件数据。
  3. 发送POST请求:

    • 使用 request.post 方法发送带有 formData 的 POST 请求。
    • 响应结果会在回调函数中返回。

注意事项

  • 确保安装了必要的依赖库:

    npm install request form-data
    
  • 如果上传接口对文件名有特定要求或需要额外的字段,可以根据实际情况调整 formData.append 的参数。

这种方法可以有效地模拟上传图片的过程,而不需要手动处理复杂的请求头和请求体。


已解决,用needle搞定

对于你的需求,request 库可能不是最佳选择,因为它已经被废弃了。你可以使用 axios 或者 node-fetch 等现代库来处理 HTTP 请求。但为了满足你的问题,这里我将展示如何使用 axios 来模拟上传图片。

首先,你需要安装 axiosform-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。同时,确保你已经安装了 axiosform-data 包。

回到顶部