NodeJs——使用axios下載上傳文件


前言

好記性不如爛筆頭~

內容

axios封裝 | request.js

import axios from "axios";
import staticPath from "../config/staticPath";
import {getConfig} from "./config";


const request = axios.create({
    baseURL: staticPath.BaseApi,
    timeout: 20000,
    adapter: require('axios/lib/adapters/http')
})

// 異常攔截處理器
const errorHandler = error => {
    error.response && console.error(`errorHandler: ${error.response.status}, ${error.response.data.message}`)
    return Promise.reject(error)
}

// 請求攔截器
request.interceptors.request.use(config => {
    if (!config.headers['Content-Type'])  config.headers['Content-Type'] = 'application/json'
    // 我這里存在多種baseURL的情況,所以根據渠道來進行判斷使用不同的域名
    if (config.requestBase) {
        let configData = getConfig()xxx
        if (staticPath.Channel === 'channel1xxxx') config.baseURL = configData.xxx_oss_host || ''
        if (staticPath.Channel  === 'default') config.baseURL = configData.xxxx_upload_host || ''
    }

    return config
}, errorHandler)

// 響應攔截器
request.interceptors.response.use(response => {
    if (response.data.streams && response.data.format) {
        return response.data
    }
    // 我這里response.data.success是結合服務端自定義的返回字段來進行判斷,不涉及可以直接干掉
    if (response.status !== 200 || !response.data.success) {
        return Promise.reject(response.data)
    }
    return response.data
}, errorHandler)


export default request

API封裝 | api.js

import request from '../utils/request';
import fs from "fs";
const FormData = require('form-data')


const Api = {
    getConfig : '/im/machines/new',
    uploadFile: '/file/upload',
    getFileLink: '/file/getResources',
}

/**
 * 獲取小助手配置信息
 * @param {object} data 請求數據
 * @return {AxiosPromise}
 */
export function getConfigInfo(data) {
    return request({
        url: Api.getConfig,
        method: 'POST',
        data: data
    })
}

/**
 * 文件下載
 * @param {string} url 文件鏈接地址
 * @return {AxiosPromise}
 */
export function getFileDownloadURL(url) {
    return request({
        url: url,
        method: 'GET',
        responseType: 'stream'
    })
}

/**
 * 上傳文件
 * @param {string} filePath 本地文件路徑
 * @return {AxiosPromise}
 */
export function uploadMsgFile(filePath) {
    let formData = new FormData()
    formData.append('multipartFile', fs.createReadStream(filePath))
    let headers = formData.getHeaders()
    return request({
        url: Api.uploadFile,
        method: 'POST',
        data: formData,
        headers: headers,
        requestBase: true
    })
}

/**
 * 獲取文件下載地址
 * @param {string} params 文件的KEY
 * @return {AxiosPromise}
 */
export function getFileLink(params) {
    return request({
        url: Api.getFileLink,
        method: 'GET',
        params: params,
        requestBase: true
    })
}

使用示例

// 正常使用
import {getConfigInfo} from "../api";
getConfigInfo({...staticPath.WeComHelperInfo}).then(r => { console.log(r) }).catch(err => console.error(`getConfigInfo: 獲取配置文件請求異常${JSON.stringify(err)}`))

// 下載文件
 const streamWriter = fs.createWriteStream(localFile)
 let response = await getFileDownloadURL(url).catch(error => console.error(`getFileDownloadURL: 下載文件異常${JSON.stringify(error)}`))
 response.pipe(streamWriter)
 streamWriter.on('finish', () => {console.log('下載完成') })
 streamWriter.on('error', error => console.error(`streamWriter: 文件寫入異常${error}`))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM