使用最小 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日

相关文章

  • asp.net使用jquery模板引擎jtemplates呈现表格

    下面我将详细介绍“asp.net使用jquery模板引擎jtemplates呈现表格”的步骤及其示例。 jtemplates简介 jtemplates是一款基于jQuery的模板引擎,它可以帮助我们以非常简洁的方式生成HTML代码。它可以与jQuery非常好地集成,支持常用的语法结构。jtemplates提供了数据绑定、条件判断、循环等基本的模板引擎功能,可…

    C# 2023年5月31日
    00
  • ASP.NET Core文件上传与下载实例(多种上传方式)

    ASP.NET Core 文件上传与下载实例 在 ASP.NET Core 中,可以使用多种方式实现文件上传和下载。本攻略将详细介绍如何在 ASP.NET Core 中实现文件上传和下载,并提供多种上传方式的示例。 文件上传 单文件上传 在 ASP.NET Core 中,可以使用 IFormFile 接口实现单文件上传。以下是一个简单的单文件上传示例: [H…

    C# 2023年5月17日
    00
  • c# .net在WEB页中的COOKIES设置技巧

    以下是“c# .net在WEB页中的COOKIES设置技巧”的攻略: 1. 什么是Cookies? Cookie(cookie,小甜饼)是一种用于存储会话信息的小型数据文件,与某个特定的Web站点相关联。Cookie在服务器和Web浏览器之间传递,并可用于存储个人信息,如用户名、密码等等。这可以大大提高用户体验,因为它允许用户在未来使用数据而无需重新登录。 …

    C# 2023年5月31日
    00
  • 基于数据类型转换(装箱与拆箱)与常量详解

    基于数据类型转换(装箱与拆箱)与常量详解 数据类型转换 数据类型转换是指将一种数据类型转换成另一种数据类型的过程。在Java中,数据类型可以分为两种:基本数据类型和引用数据类型。而数据类型转换又分为两种:自动类型转换和强制类型转换。 自动类型转换 自动类型转换是指将数据类型范围小的类型转换为数据类型范围大的类型的过程。在此过程中,系统会自动将数据类型范围小的…

    C# 2023年5月15日
    00
  • C#实现将千分位字符串转换成数字的方法

    我们来详细讲解一下“C#实现将千分位字符串转换成数字的方法”的攻略。 一、问题简述 在写代码过程中,有时候需要将千分位字符串转换成数字类型。比如,“1,234,567.89”这样的字符串,需要将它转换成浮点数1234567.89。那么,如何在C#中实现这个功能呢? 二、解决方案 在C#中,我们可以使用 NumberStyles.Currency 来将包含货币…

    C# 2023年6月8日
    00
  • C#自动生成漂亮的水晶效果头像的实现代码

    请允许我为您详细讲解C#自动生成漂亮的水晶效果头像的实现代码的完整攻略。 1. 实现思路 实现水晶效果头像的主要思路如下: 下载头像图片,使用C#的Graphics类进行处理。 将头像图片转换成灰度图像。 通过C#的ImageMagick库实现对灰度图像进行透明化和模糊化操作。 根据处理后的灰度图像生成水晶效果。 2. 实现步骤 接下来我将为您逐一介绍实现水…

    C# 2023年6月6日
    00
  • C#面向对象设计原则之里氏替换原则

    C#面向对象设计原则之里氏替换原则 什么是里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是面向对象设计中的一个基本原则。它重新定义了关于继承的条款。原始的定义是由“Barbara Liskov”于1987年提出的:“如果对于每一个类型为 T1 的对象 o1 都有类型为 T2 的对象 o2,使得以 T1 定义的…

    C# 2023年5月14日
    00
  • .Net Core简单使用Mvc内置的Ioc(续)

    .NET Core简单使用Mvc内置的Ioc(续) 在上一篇攻略中,我们介绍了如何在.NET Core应用程序中使用Mvc内置的Ioc容器。在本攻略中,我们将继续介绍如何使用Mvc内置的Ioc容器,并提供两个示例说明。 1. 注册服务 在.NET Core应用程序中,可以使用IServiceCollection接口的AddTransient、AddScope…

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