使用最小 WEB API 实现文件上传会遇到的坑

使用最小 WEB API 实现文件上传可能会遇到以下几个问题:

  1. 没有文件上传的权限
  2. 文件大小限制
  3. WEB API 跨域问题
  4. 上传进度条显示
  5. 文件上传成功后的处理

为了解决以上问题,可以按照以下步骤进行操作:

  1. 配置服务器端文件上传权限

    • 首先需要查看服务器是否允许文件上传,若未允许需要更改配置文件。
    • 对于 Nginx,需在 nginx.conf 中添加以下内容,设置上传路径和文件大小限制:

    server {
    listen 80;
    server_name localhost;
    client_max_body_size 20m; # 允许上传文件的最大大小
    location /upload {
    alias /home/user/upload; # 设置上传路径
    client_body_temp_path /var/nginx/client_temp;
    client_body_in_file_only on;
    client_body_buffer_size 32K;
    keepalive_timeout 30s;
    }
    ...
    }

    2. 编写前端代码
    - 在 HTML 中添加一个 form 表单,设置 enctype 属性,使其能够上传文件。
    - 在表单中添加一个 input 标签,type 为 file,name 为 file。
    - 监听表单提交事件,在事件处理函数中使用 XMLHttpRequest 对象发送 POST 请求,FormData 对象中添加上传的文件,发送请求给服务器。

    ```html




    ```

  2. 处理跨域问题

    • 如果服务端和客户端不在同一个域名下,需要使用 CORS 协议处理跨域问题。
    • 在服务器端设置 Access-Control-Allow-Origin 响应头,允许来自不同域名的请求。

    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'POST');
    res.setHeader('Access-Control-Max-Age', '86400');

  3. 上传进度条显示

    • 可以使用 XHR 的 onprogress 事件监听上传进度。
    • 在事件处理函数中获取上传进度,更新进度条的显示状态。

    javascript
    xhr.upload.onprogress = function(event) {
    const progress = event.loaded / event.total * 100;
    // 更新进度条显示状态
    };

  4. 文件上传成功后的处理

    • 可以在服务器端将上传的文件保存到指定的路径下。
    • 向客户端返回上传结果,例如上传成功或上传失败。

    javascript
    formData.parse(req, function(err, fields, files) {
    if (err) {
    // 上传失败
    res.status(500);
    res.send('上传失败');
    } else {
    // 将文件保存到指定路径下
    const newPath = '/home/user/upload/' + files.file.name;
    fs.rename(files.file.path, newPath, function() {
    // 上传成功
    res.status(200);
    res.send('上传成功');
    });
    }
    });

示例一:

客户端代码:

<!DOCTYPE html>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <form id="upload-form" enctype="multipart/form-data">
        <input type="file" name="file"/>
        <input type="submit" value="上传"/>
    </form>
    <script>
    const form = document.querySelector('#upload-form');
    form.addEventListener('submit', function(event) {
        event.preventDefault();
        const xhr = new XMLHttpRequest();
        const formData = new FormData(event.target);
        xhr.open('POST', 'http://localhost:8000/upload');
        xhr.upload.onprogress = function(event) {
            const progress = event.loaded / event.total * 100;
            console.log(progress);
        };
        xhr.onload = function(event) {
            console.log('上传成功');
        };
        xhr.send(formData);
    });
    </script>
</body>
</html>

服务端代码:

const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ dest: 'uploads/' });

app.set('port', process.env.PORT || 8000);

app.post('/upload', upload.single('file'), function(req, res, next) {
    const file = req.file;
    if (!file) {
        res.status(400);
        res.send('请选择上传文件');
    }
    const newPath = '/home/user/upload/' + file.originalname;
    fs.rename(file.path, newPath, function() {
        res.setHeader('Access-Control-Allow-Origin', '*');
        res.status(200);
        res.send('上传成功');
    });
});

app.listen(app.get('port'), function() {
    console.log('服务器运行在 http://localhost:' + app.get('port') + '/');
});

示例二:

客户端代码:

<!DOCTYPE html>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <input id="file-input" type="file"/>
    <button id="upload-btn">上传</button>
    <script>
    const fileInput = document.querySelector('#file-input');
    const uploadBtn = document.querySelector('#upload-btn');
    uploadBtn.addEventListener('click', function() {
        const xhr = new XMLHttpRequest();
        const formData = new FormData();
        const file = fileInput.files[0];
        if (!file) {
            console.log('请选择上传文件');
            return;
        }
        formData.append('file', file);
        xhr.open('POST', 'http://localhost:8000/upload');
        xhr.upload.onprogress = function(event) {
            const progress = event.loaded / event.total * 100;
            console.log(progress);
        };
        xhr.onload = function(event) {
            console.log('上传成功');
        };
        xhr.send(formData);
    });
    </script>
</body>
</html>

服务端代码:

const express = require('express');
const multer = require('multer');
const app = express();
const upload = multer({ dest: 'uploads/' });

app.set('port', process.env.PORT || 8000);

app.post('/upload', upload.single('file'), function(req, res, next) {
    const file = req.file;
    if (!file) {
        res.status(400);
        res.send('请选择上传文件');
    }
    const newPath = '/home/user/upload/' + file.originalname;
    fs.rename(file.path, newPath, function() {
        res.setHeader('Access-Control-Allow-Origin', '*');
        res.status(200);
        res.send('上传成功');
    });
});

app.listen(app.get('port'), function() {
    console.log('服务器运行在 http://localhost:' + app.get('port') + '/');
});

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用最小 WEB API 实现文件上传会遇到的坑 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • AngularJS服务service用法总结

    AngularJS服务service用法总结 AngularJS是一个流行的前端框架,它提供了许多可重用的组件,包括服务(service)。服务是一个函数或对象,它可以被注入到控制器、指令等其他组件中,提供更多的功能和行为。在本文中,我们将深入探讨AngularJS中的服务(service)用法。 创建服务 要创建一个服务,我们可以使用AngularJS提供…

    C# 2023年6月1日
    00
  • c#快速写本地日志方法

    下面我就为你详细讲解“c#快速写本地日志方法”的完整攻略。 1. 确定需求及文件格式 第一步是确定你的需求及文件格式。一般来说,我们需要记录的日志信息包括时间、级别、描述、来源等。在文件格式上,常见的有TXT、XML和JSON格式等。在这里,我们以TXT格式为例。 2. 创建日志文件 在创建日志文件之前,你需要确定日志文件的路径和名称。一般来说,我们可以把日…

    C# 2023年5月15日
    00
  • C# Assembly.Load案例详解

    C# Assembly.Load案例详解 在C#开发中经常会用到动态加载程序集的功能,而C#中的Assembly.Load方法则是用于动态加载程序集的方法之一。本文将详细讲解C# Assembly.Load方法的用法及两个实例。 什么是C# Assembly.Load方法 Assembly类是.NET Framework中最重要的类之一,它代表了一个装配件,…

    C# 2023年5月15日
    00
  • 让C# Excel导入导出 支持不同版本Office

    让我详细为您讲解“让C# Excel导入导出 支持不同版本Office”的完整攻略。 1. 导入Excel 1.1. 安装相关依赖 首先需要在项目中通过NuGet安装以下两个包: Install-Package Microsoft.Office.Interop.Excel Install-Package ExcelDataReader 1.2. 读取Exce…

    C# 2023年6月6日
    00
  • C#如何通过RFC连接sap系统

    这里是C#通过RFC连接SAP系统的详细攻略。 一、前置要求 在进行RFC连接SAP系统之前,需要准备以下条件和环境: 已安装SAP GUI或SAP RFC SDK(建议使用SAP RFC SDK) 已获得SAP系统的RFC连接权限 熟悉C#编程语言 二、SAP RFC SDK介绍 SAP RFC SDK是一个允许开发人员使用C/C++或C#等语言连接到SA…

    C# 2023年5月15日
    00
  • 详解java中import的作用

    在Java中,import关键字用于导入其他类或接口的定义,以便在当前类中使用。本文将详细介绍Java中import的作用,包括import的语法、使用方法和注意事项等。 import的语法 在Java中,import关键字的语法如下: import package.name.ClassName; 其中,package.name是要导入的类或接口所在的包名,…

    C# 2023年5月15日
    00
  • C#实现获取程序路径方法小结

    C#实现获取程序路径方法小结 在开发C#程序时,有时候需要获取当前程序的路径,可以使用以下方法。 获取当前程序运行路径 以下是获取当前程序运行的路径的代码: string path = AppDomain.CurrentDomain.BaseDirectory; //或者使用以下逻辑 string path2 = System.IO.Directory.Ge…

    C# 2023年6月7日
    00
  • C#使用Selenium+PhantomJS抓取数据

    我会为您提供一份详细的攻略。 1. 准备工作 如果您需要使用C#编写程序来使用Selenium和PhantomJS抓取网页数据,那么您需要先准备以下几个工具和组件: Visual Studio:C#开发环境 Selenium WebDriver:Selenium C#库 PhantomJS:无头浏览器 2. 安装和设置Selenium和PhantomJS 安…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部