مشكلة تحديد اسم جديد للملف المحمل في اضافة التحميل في ionic

زياد العتيبي • منذ سنة

بصور الكود وابغاكم تجدون حل للمشكلة هذه داخل كودي بس عشان اوضح المشكلة

filetransfer.download(ur',path,"1.mp4")

هذه الاضافة في اخر مدخل تجعلني اختار اسم للملف المنزل. انا ابغاه بنفس اسمه كيف اسويها؟ عندي الوضع معقد شوي فبرسل الكود عشان لو بسوي تعديل هنا لازم اعدل اماكن ثانية.

هنا عندي video.ts ويكون فيه تحميل الفيديوهات والتحقق من وجودها بالسيرفر وهو ياخذ روابط الفيديوهات واسماءها الجديدة من ملف ثاني يكون dictanaiory لكل عنصر اسم الفيديو ووصف لها ورابط تنزيله. 

import { Injectable } from '@angular/core';
import { FileTransfer, FileTransferObject } from '@ionic-native/file-transfer';
import { File, Flags, DirectoryEntry } from '@ionic-native/file';
import videos from './videoLinks';

@Injectable()
export class VideoProvider {

  flags: Flags;

  constructor(
    private file: File,
    private transfer: FileTransfer
  ) { }

  /**
   * @description get videos by indicating a set
   * @param {number} set
   */
  get(set: number) {
    return new Promise<any>((resolve, reject) => {
      let result = [];
      Promise.all([videos[set].map((video) => {
        this.fetch(video)
          .then((file) => result.push({ metadata: video, file: file }))
          .catch(err => console.log(err));
      })]).then(res => resolve(result));
    });
  }

  /**
   * @description fetch a single video
   * @param {string} url
   */
  private fetch(video) {
    return new Promise<any>((resolve, reject) => {
      this.file.checkFile(this.file.externalDataDirectory, video.name)
        .then(exists => {
          // fetch file from storage
          this.file.resolveDirectoryUrl(this.file.externalDataDirectory)
            .then((directoryEntry: DirectoryEntry) => {
              this.file.getFile(directoryEntry, video.name, this.flags)
                .then(fileEntry => resolve(fileEntry))
                .catch(err => console.log(err));
            });
        })
        .catch(err => {
          // download file
          const fileTransfer: FileTransferObject = this.transfer.create();
          fileTransfer.download(video.url, this.file.externalDataDirectory + video.name).then((entry) => {
            this.save(video.name, entry);
            resolve(entry);
          }).catch(err => console.log(err));
        });
    });
  }

  /**
 * @description save a video
 * @param {string} url
 */
  private save(name: string, file) {
    this.file.writeFile(this.file.dataDirectory, name, file, { replace: true })
      .catch(err => console.log(err));
  }

}

مثال للdictionary 

 {
            'name': 'video1.mp4',
            'videoName':'مقطع',
            'description':'description',
            'url': 'https://drive.google.com/uc?export=download&id=1JadFckYy--LJDl_NfZMuiBnrymCJa-Nt'
        },

 

الicon اللي اذا ضغطته يحمل الفيديوهات اتوقع انه مهم

<div class="video-block" (click)="play()">
    <ion-card text-center>
        <p>{{video.metadata.videoName}}</p>
        <p>{{video.metadata.description}}</p>
        <ion-icon name="play"></ion-icon>
    </ion-card>
</div>

 

كود دالة play 

import { Component, Input } from '@angular/core';
import { StreamingMedia, StreamingVideoOptions } from '@ionic-native/streaming-media';

@Component({
  selector: 'video-play',
  templateUrl: 'video.html'
})
export class VideoComponent {

  @Input() video: any;

  constructor(private streamingMedia: StreamingMedia) {
  }

  /**
   * @description play video on media stream player
   */
  play() {
    let options: StreamingVideoOptions = {
      successCallback: () => { console.log('Video played') },
      errorCallback: (e) => { console.log(e) },
      shouldAutoClose: true,
      controls: true
    };
    this.streamingMedia.playVideo(this.video.file.nativeURL, options);
  }

}

 

اخر كود موجود عندي

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { VideoProvider } from '../../providers/video/video';

@IonicPage({
  name: 'GradePage'
})
@Component({
  selector: 'page-grade',
  templateUrl: 'grade.html',
})
export class GradePage {

  videos: any = [];

  constructor(
    public navCtrl: NavController,
    public navParams: NavParams,
    public video: VideoProvider
  ) {
  }

  ionViewDidLoad() {
    let grade = this.navParams.get('grade');
    this.getVideos(grade);
  }

/**
 * @description fetch videos by indicating a set
 * @param {number} set
 */
  getVideos(set: number) {
    this.video.get(set)
      .then(videos => { this.videos = videos; console.log(this.videos) })
      .catch(err => console.log(err));
  }

}

 

كلمات دليلية: ionic

ساعد بالإجابة

"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."

الإجابات (1)

Ali Majrashi • منذ سنة

راجعت التوثيق بموقع ionic بالنسبه لاستخدام File Transfer لتحميل ملفات انت تحتاج تحدد الاسم في ثاني مدخل مع مسار حفظ الملف داخل المشروع هنا مثال من موقعهم 

download() {
  const url = 'http://www.example.com/file.pdf';
  fileTransfer.download(url, this.file.dataDirectory + 'file.pdf').then((entry) => {
    console.log('download complete: ' + entry.toURL());
  }, (error) => {
    // handle error
  });
}

شفت الكود عندك انت تقريبا مستخدم نفس الشي فما ادري وين الخطا الي يطلع لك او المشكلة وين بالضبط 

انت تستخدم card زي ماهو موضح بسؤالك لتشغيل الفيديو كل الي عليك تعدل الدالة play عشان تقبل الفيديو وتقدر توصل لاسم الفيديو ومعلوماته بسهولة باذن الله 

<div class="video-block" (click)="play(video)">
    <ion-card text-center>
        <p>{{video.metadata.videoName}}</p>
        <p>{{video.metadata.description}}</p>
        <ion-icon name="play"></ion-icon>
    </ion-card>
</div>

وغير الدالة عندك عشان تقبل المدخل وتعامل معه بيكون عندك اسم الفيديو والرابط وغيرها 

انا ماعرف كيف انت منفذ المشروع ولكن ممكن تورينا طريقة عمل الدالة play لما ينضغط على الزر اش يصير بالضبط لو تحط الكود نقدر نساعدك تعدل عليه 

زياد العتيبي: المشكلة ان عدد الفيديوهات عندي كبير وانا ابغ احملهم واخذ عناوينهم بنفس الوقت. مو لازم العناوين بس فعلا الروابط كل شوي انسخ والصق. انا رافع الفيديوهات في قوقل درايف وماخذ رابط مباشر لكل فيديو بس عملية متعبة عندي 400 فيديو تقريبا مع نسخ العناوين لان العناوين موجود في قوقل درايف كاسماء للفيديوهات انا ابغ اجيبها في التطبيق. لو شفت <p>{{video.metadata.videoName}}</p> موجودة في card حقة عرض الفيديوهات يمديني اغيرها واخلبها لاسماء الفيديوهات بس ما اعرف اجلب الاسماء

Ali Majrashi: في card عندك لما يضغط يتم تنفيذ الدالة play() غيرها وخليها تقبل مدخل الفيديو الي فيه معلومات الفيديو بغير تعليقي فوق واضيف كود card بالداله والمدخل

زياد العتيبي: اضفت كود دالة play فوق.

Ali Majrashi: معليش زياد بعذبك معي هذا مسؤل عن تشغيل الفيديو اذا ممكن تحط الكود المسؤل عن تحميل الفيديو لو ضغط المستخدم ايضا كود html الي فيه زر التحميل مو التشغيل

زياد العتيبي: غريبة اللكود الثاني اللي حطيته الطويل هو حق تحميل الفيديو. ما بقى عندي الا كود واحد في المشروع وبحطه في الاخير وخلاص هذه كل الاكواد الموجودة عندي اظن

زياد العتيبي: اذا ما ساعد اعطيني يوزرك بgithub اسويلك invite تشوف الكود وتقولي عن المشكلة.

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !