не могу загрузить изображение на AWS S3 через nodejs и трепетать с предопределенным URL - PullRequest
0 голосов
/ 31 января 2019

Я пытался сделать загрузку изображений с помощью dart / flutter с aws s3 bucket с заранее заданным URL через nodejs.Я успешно сгенерировал предварительно назначенный URL-адрес и отправил его обратно во внешний интерфейс, но не могу сделать запрос пут над s3 с файлом. Если я печатаю код состояния, я получаю 400.

 import 'dart:io';
import 'dart:convert';
import 'package:path/path.dart';
import 'package:async/async.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';
import 'package:mime/mime.dart';
import '../global.dart';

class AddAccount extends StatelessWidget {
  Widget build(context) {
    return Scaffold(
      appBar: AppBar(
        iconTheme: IconThemeData(
          color: Colors.grey
        ),
        title: Text('Add Account', style: TextStyle(color: Colors.black54, fontSize: 20.0)),
        backgroundColor: Colors.white,
      ),
      body: addAccountBody(context),
    );
  }
  Widget addAccountBody(context){
    return ListView(
      children: <Widget>[
        TextField(
          decoration: InputDecoration(
            labelText: 'email'
          ),
          textCapitalization: TextCapitalization.characters,
        ),

        TextField(
          decoration: InputDecoration(
            labelText: 'name'
          ),
          textCapitalization: TextCapitalization.characters,
        ),
        OutlineButton(
          onPressed: (){
            openImagePicker(context);
          },
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Icon(Icons.camera_alt),
              Text('add image')
            ],
          ),
        )
      ],
    );
  }
  void openImagePicker(BuildContext context){
    showModalBottomSheet(
      context: context,
      builder: (BuildContext context) {
        return Container(
          height: 80.0,
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              IconButton(
                onPressed: (){
                  getImage(context, ImageSource.camera);
                },
                icon: Icon(Icons.camera_alt),
              ),
              SizedBox(width: 20.0,),
              IconButton(
                onPressed: () async {
                  File image = await getImage(context, ImageSource.gallery);
                  http.Response response = await http.get('$url1/api/upload', headers: {
                    "x-auth" : 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YzQ0M2M0NDE0NjkxODM3ZTQxNTMxZTgiLCJhY2Nlc3MiOiJhdXRoIiwiaWF0IjoxNTQ3OTc1NzQ5fQ.73_tyhu3vTpsnMncmjTS0xDBec08pScxpa35yRlLuzQ'
                  });
                  Map<String, dynamic> uploadUrl = json.decode(response.body);
                  final dataType = lookupMimeType(image.path).split("/");
                  final imageUploadRequest = http.MultipartRequest("PUT", Uri.parse(uploadUrl['url']));
                  final file = await http.MultipartFile.fromPath("${uploadUrl['key']}", image.path, contentType: MediaType(dataType[0], dataType[1]));
                  imageUploadRequest.files.add(file);
                  imageUploadRequest.fields['user'] = Uri.encodeComponent('user');
                  imageUploadRequest.headers['Content-Type'] = 'image/jpeg';
                  print(file.contentType);
                  try{
                    final streamedResponse = await imageUploadRequest.send();
                    final res = await http.Response.fromStream(streamedResponse);
                     print(res.statusCode);
                  }catch(e){
                    print(e);
                  }
                },
                icon: Icon(Icons.camera),
              ),

            ],
          ),
        );
      }
    ); 
  }
  Future<File> getImage(BuildContext context, ImageSource sourse) async {
    File file = await ImagePicker.pickImage(source: sourse, maxWidth: 400.0);
    Navigator.pop(context);
    return file;

  }
}

код флаттера

    const AWS = require('aws-sdk');
const uuid = require('uuid/v1');
const keys = require('../config/keys');
const { authenticate } = require('../middleware/authenticate')

const s3 = new AWS.S3({
    accessKeyId: keys.accessKeyId,
    secretAccessKey: keys.secretAccessKey
});

module.exports = (app) => {
    app.get('/api/upload', authenticate, (req,res) => {
        console.log(req.user.id);
        const key = `${req.user.id}/${uuid()}.jpeg`;
        s3.getSignedUrl('putObject', {
            Bucket: 'flutter-bucket',
            ContentType: 'image/jpeg',
            Key: key
        }, (err, url) => {
            res.send({key, url});
        })
    });
}

код узла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...