HarmonyOS鸿蒙Next中上传图片到服务器需要配置后端nodejs 下一篇

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS鸿蒙Next中上传图片到服务器需要配置后端nodejs 下一篇

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { promptAction } from '@kit.ArkUI';
import { fileIo } from '@kit.CoreFileKit';
import { request } from '@kit.BasicServicesKit';

class ResponseResult {
  code: string;
  msg: string | Resource;
  data: string | Object | ArrayBuffer;

  constructor() {
    this.code = '';
    this.msg = '';
    this.data = '';
  }
}

@Entry
@Component
struct SelectPhoto {
  @State imageUri: string = ''
  @State isUploading: boolean = false
  @State imgName: string | undefined = ''

  //从相册选择图片
  async fileSelect(): Promise<string> {
    let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
    photoSelectOptions.maxSelectNumber = 1;
    let photoPicker = new photoAccessHelper.PhotoViewPicker();
    try {
      let photoSelectResult = await photoPicker.select(photoSelectOptions);
      if (photoSelectResult && photoSelectResult.photoUris && photoSelectResult.photoUris.length > 0) {
        let imgUri = photoSelectResult.photoUris[0];
        if (imgUri.indexOf('media/Photo') < 0) {
          promptAction.showToast({
            message: '请选择图片进行上传',
            duration: 1000
          });
          return '';
        }
        return photoSelectResult.photoUris[0];
      } else {
        return '';
      }
    } catch (err) {
      console.log('失败')
      return '';
    }
  }

  selectImage() {
    this.fileSelect().then((uri: string) => {
      this.imageUri = uri || '';
    });
  }

  savePhotoToSandbox(context: Context, fileUri: string) {
    // 获取应用的沙箱路径
    let cacheDir = context.cacheDir;
    // 获取到文件名
    this.imgName = fileUri.split('/').pop();
    // 图片保存到沙箱中的目标路径
    let dstPath = cacheDir + '/' + this.imgName;

    // fileIo.openSync: 以同步的方式打开文件
    // srcFile.fd 获取文件描述符
    let srcFile = fileIo.openSync(fileUri); // 以只读方式打开

    // fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE
    // 如果没有该文件,则创建并打开,如果有,以可读可写的方式打开
    let dstFile = fileIo.openSync(dstPath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
    // 把源文件复制到沙箱中的目标文件
    fileIo.copyFileSync(srcFile.fd, dstFile.fd);
    fileIo.closeSync(srcFile);
    fileIo.closeSync(dstFile);
    console.log('已经把图片放入沙箱,可以开始上传了')
  }

  async fileUpload(context: Context) {
    let uploadRequestOptions: request.UploadConfig = {
      url: "http://172.16.1.103:3000/upload",
      header: {
        'Content-Type': 'multipart/form-data'
      },
      method: "post",
      files: [{
        filename: this.imgName as string,
        name: 'file',
        uri: 'internal://cache/' + this.imgName,
        type: 'jpg'
      }],
      data: []
    };
    let serverData = new ResponseResult();
    // Upload the file.
    request.uploadFile(context, uploadRequestOptions).then((data: request.UploadTask) => {
      data.on('complete', (result: Array<request.TaskState>) => {
        console.log('uploadFile success', JSON.stringify(result));
        if (result && result.length >= 1) {
          serverData.code = '200';
          serverData.msg = result[0].message;
          serverData.data = '/images/' + result[0].path.split('/').pop();
          console.log('1.serverData', JSON.stringify(serverData));
        }
      });
      data.on('fail', (result: Array<request.TaskState>) => {
        console.info('uploadFile failed', JSON.stringify(result));
        if (result && result.length >= 1) {
          serverData.msg = "上传文件失败,请重试!";
          console.log('2.serverData', JSON.stringify(serverData));
        }
      })
    }).catch((err: Error) => {
      console.error('uploadFile failed', JSON.stringify(err));
      console.log('3.serverData', JSON.stringify(serverData));
    });
  }

  build() {
    Column() {
      Text('图片地址' + this.imageUri)
      // 从相册选择图片
      Image(this.imageUri ? this.imageUri : $r('app.media.startIcon'))
        .width(100)
        .height(100)
        .objectFit(ImageFit.Cover)

      Button("1.选择图库中的图片").onClick(() => this.selectImage())

      Button("2.把图片放入沙箱中").onClick(() => {
        this.savePhotoToSandbox(getContext(this), this.imageUri)
      })
      Button("3.上传沙箱中的图片").onClick(() => {
        this.fileUpload(getContext(this))
      })

    }
  }
}

更多关于HarmonyOS鸿蒙Next中上传图片到服务器需要配置后端nodejs 下一篇的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中上传图片到服务器,如果使用Node.js作为后端,需要进行以下配置:

  1. 安装依赖:首先,确保Node.js环境已安装。然后,使用npm安装必要的依赖,如express用于创建服务器,multer用于处理文件上传。

    npm install express multer
  2. 创建服务器:在Node.js中创建一个简单的Express服务器,并配置multer来处理文件上传。

    const express = require('express');
    const multer = require('multer');
    const path = require('path');
    
    const app = express();
    const upload = multer({ dest: 'uploads/' });
    
    app.post('/upload', upload.single('image'), (req, res) => {
        res.send('File uploaded successfully');
    });
    
    app.listen(3000, () => {
        console.log('Server started on http://localhost:3000');
    });
  3. 前端请求:在HarmonyOS鸿蒙Next中,使用fetchaxios等工具发送POST请求,将图片上传到服务器。

    const formData = new FormData();
    formData.append('image', file);
    
    fetch('http://localhost:3000/upload', {
        method: 'POST',
        body: formData
    }).then(response => response.text())
      .then(data => console.log(data))
      .catch(error => console.error(error));
  4. 文件处理:在服务器端,multer会将上传的文件保存到指定的目录(如uploads/),并返回文件信息。可以根据需要对文件进行进一步处理,如重命名、压缩等。

  5. 安全性:确保服务器端对上传的文件进行安全验证,防止恶意文件上传。可以通过检查文件类型、大小等来增强安全性。

以上步骤完成了在HarmonyOS鸿蒙Next中使用Node.js后端上传图片到服务器的基本配置。

更多关于HarmonyOS鸿蒙Next中上传图片到服务器需要配置后端nodejs 下一篇的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中上传图片到服务器,若后端使用Node.js,需配置以下步骤:

  1. 创建HTTP服务器:使用Express框架创建服务器,处理接收的图片数据。
  2. 配置路由:设置POST路由,用于接收前端上传的图片文件。
  3. 处理文件上传:使用multer中间件处理文件上传,保存到指定目录。
  4. 返回响应:上传成功后,返回成功信息或图片访问路径。

代码示例:

const express = require('express');
const multer = require('multer');
const app = express();

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

app.post('/upload', upload.single('image'), (req, res) => {
  res.send('上传成功');
});

app.listen(3000, () => console.log('服务器启动'));

确保前端请求的URL与服务器配置一致。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!