JS使用OSS上传文件遇到的一些问题

使用阿里云OSS JavaScript SDK上传图片

博客里看:https://www.zjhuiwan.cn/info/20200603/4012062473071713.html

html代码:

<input type='file' accept=\"image/*\" name='option' οnchange='uploadPic(this)' style='width: 80%;margin-right: 12px;'/>

 

JS代码

<!-- 引入在线资源 -->
<script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-5.3.0.min.js"></script>

<script type="text/javascript">
var client = new OSS.Wrapper({
    region: 'oss-cn-hangzhou',
    accessKeyId: 'xxxxxxx',
    secure:true,
    accessKeySecret: 'xxxxxxx',
    bucket: 'xxx'
});
function uploadPic(obj){
    var file=obj.files[0];//获取文件流
    var val= obj.value;
    var suffix = val.substr(val.indexOf("."));
    var storeAs = "studio_course/"+timestamp()+suffix;
    console.log(file.name + ' => ' + storeAs);
    client.multipartUpload(storeAs, file).then(function (result) {
        console.log(result)
    }).catch(function (err) {
        console.log(err);
    });
}


/**
 * 生成文件名
 * @returns
 */
function timestamp(){
    var time = new Date();
    var y = time.getFullYear();
    var m = time.getMonth()+1;
    var d = time.getDate();
    var h = time.getHours();
    var mm = time.getMinutes();
    var s = time.getSeconds();
    console.log(y);
    return ""+y+add0(m)+add0(d)+add0(h)+add0(mm)+add0(s);
}
function add0(m){
    return m<10?'0'+m : m;
}
</script>

 

以上为js上传图片的完整代码

参数备注:

  accessKeyId:连接阿里云的accessKeyId

  accessKeySecret:连接阿里云的accessKeyScret

  dir:文件夹的名称

  bucketName:阿里云bucketName的名称

  file:文件流

timestamp()根据年月日时分秒生产文件名
------------------------------------------------------------------------------
  region:“xxx” //oss区域

  accessKeySecret:连接阿里云的accessKeyScret

  dir:文件夹的名称

  bucket:阿里云oss的名称

返回结果:

image.png

最后拼接路径:

imgurl="https://"+bucket+".oss-cn-hangzhou.aliyuncs.com/"+ result.name;

遇到的几个问题:

跨域问题

image.png

解决办法:阿里云oss设置跨域访问

OSS 提供 HTML5 协议中的跨域资源共享 CORS 设置,帮助您实现跨域访问。当 OSS 收到一个跨域请求(或者 OPTIONS 请求)时,会读取存储空间对应的 CORS 规则,然后进行相应的权限检查。OSS 会依次检查每一条规则,使用第一条匹配的规则来允许请求并返回对应的 header。如果所有规则都匹配失败,则不附加任何 CORS 相关的 header。

  1. 进入 OSS 管理控制台 界面。

  2. 在左侧存储空间列表中,单击目标存储空间名称,打开该存储空间概览页面。

  3. 单击 基础设置 页签,找到 跨域设置 区域,然后单击 设置。

  4. 单击 创建规则,打开 设定跨域规则 对话框。

  5. 设置跨域规则。

    • 来源:指定允许的跨域请求的来源。允许多条匹配规则,以回车为间隔。每个匹配规则允许使用最多一个“*”通配符。

    • 允许 Methods:指定允许的跨域请求方法。

    • 允许 Headers:指定允许的跨域请求 header。允许多条匹配规则,以回车为间隔。每个匹配规则使用最多一个“*”通配符。

    • 暴露 Headers:指定允许用户从应用程序中访问的响应头(例如一个 Javascript 的 XMLHttpRequest 对象)。

    • 缓存时间:指定浏览器对特定资源的预取(OPTIONS)请求返回结果的缓存时间。

      说明: 每个存储空间最多可以配置 10 条规则。

  6. 单击 确定。

 

image.png

InvalidPartError400报错

image.png

解决办法:阿里云oss设置跨域访问时给暴露 Headers添加Etag

image.png

RequestError: XHR error (req "error"), POST http://xxx.xxx/uploa......报错

解决办法:在配置中加入secure:true

var client = new OSS.Wrapper({
region : 'oss-cn-hanghzou',
secure:true,//*这句话很重要!!!!!!!!!
accessKeyId : 'xxx',
accessKeySecret : 'xxx',
bucket : 'xxx'
});

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
好的,针对你的第一个问题,我可以告诉你如何使用 JavaScript 实现 OSS 批量下载文件的功能。 首先,你需要使用阿里云提供的 OSS SDK for JavaScript,通过 npm 安装: ``` npm install ali-oss --save ``` 然后,你可以使用以下代码实现批量下载文件: ```javascript const OSS = require('ali-oss'); const co = require('co'); const fs = require('fs'); // 创建 OSS 客户端实例 const client = new OSS({ accessKeyId: '<AccessKeyId>', accessKeySecret: '<AccessKeySecret>', bucket: '<BucketName>', region: '<Region>', }); // 要下载的文件列表 const files = [ 'path/to/file1.txt', 'path/to/file2.txt', 'path/to/file3.txt', ]; // 下载文件 co(function* () { for (let file of files) { const result = yield client.get(file); fs.writeFileSync(`./${file}`, result.content); } }).catch(function (err) { console.log(err); }); ``` 这段代码首先创建了一个 OSS 客户端实例,然后定义了要下载的文件列表,最后使用 `co` 库实现异步流程控制,循环遍历文件列表,逐个下载文件并保存到本地。 至于你提到的第二个问题,我可以告诉你如何在 NestJS使用阿里云 OSS 进行文件上传。 首先,你需要安装 `@nest-modules/multer` 和 `ali-oss` 两个库: ``` npm install @nest-modules/multer ali-oss --save ``` 然后,你可以在 NestJS 中定义一个上传服务: ```typescript import { Injectable } from '@nestjs/common'; import { MulterModule } from '@nest-modules/multer'; import * as OSS from 'ali-oss'; @Injectable() export class UploadService { private client: OSS; constructor() { this.client = new OSS({ accessKeyId: '<AccessKeyId>', accessKeySecret: '<AccessKeySecret>', bucket: '<BucketName>', region: '<Region>', }); } async upload(file: Express.Multer.File): Promise<string> { const result = await this.client.put(file.originalname, file.buffer); return result.url; } } ``` 这段代码定义了一个 `UploadService`,通过 `ali-oss` 库创建了一个 OSS 客户端实例,在 `upload` 方法中实现了文件上传功能,返回上传后的文件 URL。 最后,你可以在 NestJS 控制器中使用这个上传服务: ```typescript import { Controller, Post, UseInterceptors, UploadedFile } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; import { UploadService } from './upload.service'; @Controller('upload') export class UploadController { constructor(private readonly uploadService: UploadService) {} @Post() @UseInterceptors(FileInterceptor('file')) async upload(@UploadedFile() file: Express.Multer.File): Promise<string> { return this.uploadService.upload(file); } } ``` 这段代码定义了一个 `UploadController` 控制器,使用 `@UseInterceptors` 装饰器启用 `FileInterceptor` 中间件,将上传的文件传递给 `upload` 方法,调用上传服务上传文件并返回文件 URL。 希望这些代码能够帮助到你,如果你还有其他问题,可以随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值