דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. העלאת קובץ בapi לימות המשיח | קוד שבפייתון עובד וב nodejs לא כל כך

העלאת קובץ בapi לימות המשיח | קוד שבפייתון עובד וב nodejs לא כל כך

מתוזמן נעוץ נעול הועבר תכנות
13 פוסטים 4 כותבים 1.0k צפיות 5 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid
    ניהול
    כתב ב נערך לאחרונה על ידי dovid
    #2

    שלח לי טוקן, אני רוצה לנסות.
    הנה בינתיים (בלי תיקון לעצם הבעיה) קוד הרבה יותר יעיל
    (כמו הפייתון המקורי, היעילות היא מבחינת זיכרון וגבול עליון לזיכרון), וגם יותר נח לעבודה (ובלי שום ספריה חיצונית).
    עריכה: הfetch המובנה של נוד כנראה לא שם אוטומטית contentType לFormData אז כן השתמשתי בספריה node-fetch.

    import fs from 'fs/promises';
    import fetch from 'node-fetch';
    import FormData from 'form-data';
    
    async function* getChunks(filePath, chunkSize = 5000000) {
        const file = await fs.open(filePath, 'r');
        const buffer = Buffer.alloc(chunkSize);
    
        while (true) {
            const result = await file.read(buffer, 0, chunkSize);
            if (result.bytesRead === chunkSize)
                yield  result.buffer;
            else {
                yield result.buffer.slice(0, result.bytesRead);
                break;
            }
        }
        await file.close();
    }
    
    
    function createFormData(bytes, partialData = null) {
        const formData = new FormData();
        formData.append('token', tokenYemot);
        formData.append('path', remotePath);
        formData.append('convertAudio', 1);
        formData.append('autoNumbering', 1);
    
        if (partialData) {
            formData.append('qquuid', partialData.uuid);
            formData.append('qqfilename', partialData.contentName);
            formData.append('qqtotalfilesize', partialData.fileSize);
            formData.append('qqtotalparts', partialData.partCount);
            formData.append('qqchunksize', chunkSize);
    
            //in final post request we don't need to send the file
            if (partialData.partCount > (partialData.part + 1)) {
                formData.append('qqpartbyteoffset', chunkSize * partialData.part);
                formData.append('qqpartindex', partialData.part);
                formData.append('qqfile', bytes);
            }
        } else
            formData.append('file', bytes);
    
        return formData;
    }
    
    const tokenYemot = '';
    const chunkSize = 5000000;
    const remotePath = 'ivr2:/2';
    
    async function uploadFile(filePath)  {
        const fileSize = (await fs.stat(filePath)).size;
        const callApi = (url, payload) => fetch(url, {method: 'POST', body: payload});
        const chunks = getChunks(filePath, chunkSize);
    
    
        if (fileSize <= chunkSize) {
            const formData = createFormData((await chunks.next()).value, false);
            return await callApi('https://www.call2all.co.il/ym/api/UploadFile', formData).then(x => x.json());
        } else {
            const contentName = filePath.split('/').pop();
            const uuid = crypto.randomUUID();
            const partCount = Math.ceil(chunkSize / fileSize);
    
            let part = 0;
            for await (const chunk of chunks) {
                const formData = createFormData(chunk,
                    {contentName, uuid, fileSize, partCount, part});
                part++;
                const status = await callApi('https://www.call2all.co.il/ym/api/UploadFile', formData).then(x => x.json());
                if(!status.success){
                    console.log(status);
                    throw new Error(status.message);
                }
            }
    
            return await callApi('https://www.call2all.co.il/ym/api/UploadFile?done', createFormData(null,
                {contentName, uuid, fileSize, partCount, part})).then(x => x.json());
        }
    }
    
    const result = await uploadFile("D:/a.txt");
    console.log(result);
    
    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
    תגובה 1 תגובה אחרונה
    2
    • dovidD מנותק
      dovidD מנותק
      dovid
      ניהול
      כתב ב נערך לאחרונה על ידי
      #3

      קיבלתי את הקוד מ@צבי-ש ויש שגיאה מצד ימות, עם הודעה Syste, error, וmessageCode 105.

      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
      מנחםמ צבי-שצ 2 תגובות תגובה אחרונה
      1
      • dovidD מנותק
        dovidD מנותק
        dovid
        ניהול
        כתב ב נערך לאחרונה על ידי
        #4

        יש לציין שהשגיאה היא גם בקובץ קטן, שאין שום לולאה.

        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
        תגובה 1 תגובה אחרונה
        1
        • dovidD dovid

          קיבלתי את הקוד מ@צבי-ש ויש שגיאה מצד ימות, עם הודעה Syste, error, וmessageCode 105.

          מנחםמ מנותק
          מנחםמ מנותק
          מנחם
          כתב ב נערך לאחרונה על ידי מנחם
          #5

          @dovid כתב בהעלאת קובץ בapi לימות המשיח | קוד שבפייתון עובד וב nodejs לא כל כך:

          Syste, error, וmessageCode 105

          הסבר השגיאה היא: שגיאה כללית במהלך הטיפול בהעלאה, מקור.
          אולי לימות המשיח הפתרון.

          תגובה 1 תגובה אחרונה
          1
          • dovidD dovid

            קיבלתי את הקוד מ@צבי-ש ויש שגיאה מצד ימות, עם הודעה Syste, error, וmessageCode 105.

            צבי-שצ מחובר
            צבי-שצ מחובר
            צבי-ש
            כתב ב נערך לאחרונה על ידי צבי-ש
            #6

            @dovid כתב בהעלאת קובץ בapi לימות המשיח | קוד שבפייתון עובד וב nodejs לא כל כך:

            קיבלתי את הקוד מ@צבי-ש ויש שגיאה מצד ימות, עם הודעה Syste, error, וmessageCode 105.

            בקוד המקורי שהעלתי פה אין שגיאה כזאת, אלא על כל חלק וחלק אני מקבל תשובה שהכל תקין, וגם בסוף שעלה בסדר, שולח גם את הנתיב של הקובץ, אבל מעלה אותו עם 0kb
            מה שיוצר לי תחושה כאילו אני סתם מחלק את הקובץ לחלקים, כשבפועל בכל קריאה אני מעלה 0kb
            (תוכל לראות בשלוחה 1 שם קובץ כזה)

            כיף לגלות דברים חדשים.
            חוק ה-50-50-90: בכל פעם שיש סיכוי של 50-50 שמשהו יעבוד, יש סיכוי של 90 אחוז שהוא לא. מקור

            תגובה 1 תגובה אחרונה
            0
            • dovidD מנותק
              dovidD מנותק
              dovid
              ניהול
              כתב ב נערך לאחרונה על ידי
              #7

              עובד לי כעת קובץ בודד, בתנאי שאני מציין את שם הקובץ לFormData. הנה הקוד המעודכן:

              import fs from 'fs/promises';
              import fetch from 'node-fetch';
              import FormData from 'form-data';
              
              async function* getChunks(filePath, chunkSize = 5000000) {
                  const file = await fs.open(filePath, 'r');
                  const buffer = Buffer.alloc(chunkSize);
              
                  while (true) {
                      const result = await file.read(buffer, 0, chunkSize);
                      if (result.bytesRead === chunkSize)
                          yield  result.buffer;
                      else {
                          yield result.buffer.slice(0, result.bytesRead);
                          break;
                      }
                  }
                  await file.close();
              }
              
              
              function createFormData(bytes, contentName, partialData = null) {
                  const formData = new FormData();
                  formData.append('token', tokenYemot);
                  formData.append('path', remotePath);
                  formData.append('convertAudio', 1);
                  formData.append('autoNumbering', 1);
              
                  if (partialData) {
                      formData.append('qquuid', partialData.uuid);
                      formData.append('qqfilename', contentName);
                      formData.append('qqtotalfilesize', partialData.fileSize);
                      formData.append('qqtotalparts', partialData.partCount);
                      formData.append('qqchunksize', chunkSize);
              
                      //in final post request we don't need to send the file
                      if (partialData.partCount > (partialData.part + 1)) {
                          formData.append('qqpartbyteoffset', chunkSize * partialData.part);
                          formData.append('qqpartindex', partialData.part);
                          formData.append('qqfile', bytes, contentName);
                      }
                  } else
                      formData.append('file', bytes, contentName);
              
                  return formData;
              }
              
              const tokenYemot = '';
              const chunkSize = 5000000;
              const remotePath = 'ivr2:/';
              
              async function uploadFile(filePath)  {
                  const fileSize = (await fs.stat(filePath)).size;
                  const callApi = (url, payload) => fetch(url, {method: 'POST', body: payload});
                  const chunks = getChunks(filePath, chunkSize);
                  const contentName = filePath.split('/').pop();
              
              
                  if (fileSize <= chunkSize) {
                      const formData = createFormData((await chunks.next()).value, contentName);
                      return await callApi('https://www.call2all.co.il/ym/api/UploadFile', formData).then(x => x.json());
                  } else {
                      const uuid = crypto.randomUUID();
                      const partCount = Math.ceil(chunkSize / fileSize);
              
                      let part = 0;
                      for await (const chunk of chunks) {
                          const formData = createFormData(chunk, contentName,
                              { uuid, fileSize, partCount, part});
                          part++;
                          const status = await callApi('https://www.call2all.co.il/ym/api/UploadFile', formData).then(x => x.json());
                          if(!status.success){
                              console.log(status);
                              throw new Error(status.message);
                          }
                      }
              
                      return await callApi('https://www.call2all.co.il/ym/api/UploadFile?done', createFormData(null,
                          { uuid, fileSize, partCount, part})).then(x => x.json());
                  }
              }
              
              const result = await uploadFile("D:/testS.mp3");
              console.log(result);
              
              • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
              • בכל נושא אפשר ליצור קשר dovid@tchumim.com
              צבי-שצ תגובה 1 תגובה אחרונה
              3
              • dovidD dovid

                עובד לי כעת קובץ בודד, בתנאי שאני מציין את שם הקובץ לFormData. הנה הקוד המעודכן:

                import fs from 'fs/promises';
                import fetch from 'node-fetch';
                import FormData from 'form-data';
                
                async function* getChunks(filePath, chunkSize = 5000000) {
                    const file = await fs.open(filePath, 'r');
                    const buffer = Buffer.alloc(chunkSize);
                
                    while (true) {
                        const result = await file.read(buffer, 0, chunkSize);
                        if (result.bytesRead === chunkSize)
                            yield  result.buffer;
                        else {
                            yield result.buffer.slice(0, result.bytesRead);
                            break;
                        }
                    }
                    await file.close();
                }
                
                
                function createFormData(bytes, contentName, partialData = null) {
                    const formData = new FormData();
                    formData.append('token', tokenYemot);
                    formData.append('path', remotePath);
                    formData.append('convertAudio', 1);
                    formData.append('autoNumbering', 1);
                
                    if (partialData) {
                        formData.append('qquuid', partialData.uuid);
                        formData.append('qqfilename', contentName);
                        formData.append('qqtotalfilesize', partialData.fileSize);
                        formData.append('qqtotalparts', partialData.partCount);
                        formData.append('qqchunksize', chunkSize);
                
                        //in final post request we don't need to send the file
                        if (partialData.partCount > (partialData.part + 1)) {
                            formData.append('qqpartbyteoffset', chunkSize * partialData.part);
                            formData.append('qqpartindex', partialData.part);
                            formData.append('qqfile', bytes, contentName);
                        }
                    } else
                        formData.append('file', bytes, contentName);
                
                    return formData;
                }
                
                const tokenYemot = '';
                const chunkSize = 5000000;
                const remotePath = 'ivr2:/';
                
                async function uploadFile(filePath)  {
                    const fileSize = (await fs.stat(filePath)).size;
                    const callApi = (url, payload) => fetch(url, {method: 'POST', body: payload});
                    const chunks = getChunks(filePath, chunkSize);
                    const contentName = filePath.split('/').pop();
                
                
                    if (fileSize <= chunkSize) {
                        const formData = createFormData((await chunks.next()).value, contentName);
                        return await callApi('https://www.call2all.co.il/ym/api/UploadFile', formData).then(x => x.json());
                    } else {
                        const uuid = crypto.randomUUID();
                        const partCount = Math.ceil(chunkSize / fileSize);
                
                        let part = 0;
                        for await (const chunk of chunks) {
                            const formData = createFormData(chunk, contentName,
                                { uuid, fileSize, partCount, part});
                            part++;
                            const status = await callApi('https://www.call2all.co.il/ym/api/UploadFile', formData).then(x => x.json());
                            if(!status.success){
                                console.log(status);
                                throw new Error(status.message);
                            }
                        }
                
                        return await callApi('https://www.call2all.co.il/ym/api/UploadFile?done', createFormData(null,
                            { uuid, fileSize, partCount, part})).then(x => x.json());
                    }
                }
                
                const result = await uploadFile("D:/testS.mp3");
                console.log(result);
                
                צבי-שצ מחובר
                צבי-שצ מחובר
                צבי-ש
                כתב ב נערך לאחרונה על ידי
                #8

                @dovid כתב בהעלאת קובץ בapi לימות המשיח | קוד שבפייתון עובד וב nodejs לא כל כך:

                קובץ בודד

                אתה מתכוון פחות מ50 מגה?
                כי ניסתי קובץ גדול והיה שגיאה

                כיף לגלות דברים חדשים.
                חוק ה-50-50-90: בכל פעם שיש סיכוי של 50-50 שמשהו יעבוד, יש סיכוי של 90 אחוז שהוא לא. מקור

                תגובה 1 תגובה אחרונה
                0
                • dovidD מנותק
                  dovidD מנותק
                  dovid
                  ניהול
                  כתב ב נערך לאחרונה על ידי
                  #9

                  כן, פחות מ50.

                  • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                  • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                  תגובה 1 תגובה אחרונה
                  1
                  • I מנותק
                    I מנותק
                    ivrtikshoret
                    כתב ב נערך לאחרונה על ידי ivrtikshoret
                    #10
                    פוסט זה נמחק!
                    תגובה 1 תגובה אחרונה
                    1
                    • I מנותק
                      I מנותק
                      ivrtikshoret
                      כתב ב נערך לאחרונה על ידי
                      #11

                      @צבי-ש בשורה 55 תחליף מ:

                      formData.append('qqfile', chunk)
                      

                      ל:

                      formData.append('qqfile', chunk, {
                        filename: contentName,
                        contentType: 'application/octet-stream',
                      });
                      
                      תגובה 1 תגובה אחרונה
                      3
                      • צבי-שצ מחובר
                        צבי-שצ מחובר
                        צבי-ש
                        כתב ב נערך לאחרונה על ידי צבי-ש
                        #12

                        סליחה על המענה המאוחר, אני השתמשתי בפיתרון ש @ivrtikshoret כתב פה,
                        עבד לי מעולה, ערכתי את הפונקציה שתתאים גם לקבצים קטנים יותר.

                        const readInChunks = (filePath, chunkSize = 5000000) => {
                            const file = fs.readFileSync(filePath);
                            const chunks = [];
                          
                            for (let offset = 0; offset < file.length; offset += chunkSize) {
                              const chunk = file.slice(offset, offset + chunkSize);
                              chunks.push(chunk);
                            }
                          
                            return chunks;
                          };
                         
                        export const uploadFileInYemot = async (filePath, path, tokenYemot) => {
                            const fileSize = fs.statSync(filePath).size;
                            const contentName = filePath.split('/').pop();
                          
                            if (fileSize <= 5000000) {
                              const formData = new FormData();
                              formData.append('token', tokenYemot);
                              formData.append('path', path);
                              formData.append('convertAudio', 1);
                              formData.append('autoNumbering', 1);
                              formData.append('file', fs.readFileSync(filePath), {
                                filename: contentName,
                                contentType: 'application/octet-stream',
                              });
                              
                          
                              const response = await fetch('https://www.call2all.co.il/ym/api/UploadFile', {
                                method: 'POST',
                                body: formData,
                              });
                          
                              return await response.json();
                            } else {
                              const chunks = readInChunks(filePath);
                              const qquuid = uuidv4().toString();
                          
                              for (let i = 0; i < chunks.length; i++) {
                                const chunk = chunks[i];
                                const formData = new FormData();
                                formData.append('token', tokenYemot);
                                formData.append('path', path);
                                formData.append('qquuid', qquuid);
                                formData.append('convertAudio', 0);
                                formData.append('autoNumbering', 'true');
                                formData.append('uploader', 'yemot-admin');
                                formData.append('qqfilename', contentName);
                                formData.append('qqtotalfilesize', fileSize);
                                formData.append('qqtotalparts', chunks.length);
                                formData.append('qqchunksize', chunk.length);
                                formData.append('qqpartbyteoffset', i * chunk.length);
                                formData.append('qqpartindex', i);
                                formData.append('qqfile', chunk, {
                                    filename: contentName,
                                    contentType: 'application/octet-stream',
                                  });
                                    const response = await fetch('https://www.call2all.co.il/ym/api/UploadFile', {
                                    method: 'POST',
                                    body: formData,
                                });
                          
                                const responseData = await response.json();
                                console.log(responseData);
                              }
                          
                              
                              const finalFormData = new FormData();
                              finalFormData.append('token', tokenYemot);
                              finalFormData.append('path', path);
                              finalFormData.append('uploader', 'yemot-admin');
                              finalFormData.append('convertAudio', '0');
                              finalFormData.append('autoNumbering', 'true');
                              finalFormData.append('qquuid', qquuid);
                              finalFormData.append('qqfilename', contentName);
                              finalFormData.append('qqtotalfilesize', fileSize);
                              finalFormData.append('qqtotalparts', chunks.length);
                              try {
                                const response = await fetch('https://www.call2all.co.il/ym/api/UploadFile?done', {
                                  method: 'POST',
                                  body: finalFormData,
                                });
                                const responseData = await response.text();
                                console.log(responseData);
                              } catch (error) {
                                console.error("Error during the fetch:", error);
                              }
                            }
                          };
                          
                        

                        תודה לכל העוזרים.

                        נ.ב. תודה למי שפנה אליי באישי והאיר לי על הנושא.

                        כיף לגלות דברים חדשים.
                        חוק ה-50-50-90: בכל פעם שיש סיכוי של 50-50 שמשהו יעבוד, יש סיכוי של 90 אחוז שהוא לא. מקור

                        תגובה 1 תגובה אחרונה
                        2
                        • dovidD מנותק
                          dovidD מנותק
                          dovid
                          ניהול
                          כתב ב נערך לאחרונה על ידי dovid
                          #13

                          מעלה את הקוד המתוקן שלי שמציע כמה שיפורים, ב"ה כעת זה עובד.

                          import fs from 'fs/promises';
                          
                          const baseUrl = 'https://www.call2all.co.il';
                          
                          async function* getChunks(filePath, chunkSize) {
                              const file = await fs.open(filePath, 'r');
                              const buffer = Buffer.alloc(chunkSize);
                          
                              try {
                                  while (true) {
                                      const result = await file.read(buffer, 0, chunkSize);
                                      if (result.bytesRead === chunkSize)
                                          yield result.buffer;
                                      else {
                                          yield result.buffer.slice(0, result.bytesRead);
                                          break;
                                      }
                                  }
                              } finally {
                                  await file.close();
                              }
                          }
                          
                          
                          function createFormData(bytes, contentName, partialData = null) {
                              const data = {
                                  token: tokenYemot,
                                  path: remotePath,
                                  convertAudio: 1,
                                  autoNumbering: 0
                              };
                          
                              if (partialData) {
                                  data.uploader = 'yemot-admin';
                                  data.qquuid = partialData.uuid;
                                  data.qqfilename = contentName;
                                  data.qqtotalfilesize = partialData.fileSize;
                                  data.qqtotalparts = partialData.partCount;
                          
                                  //in final post request we don't need to send the file
                                  if (partialData.part < partialData.partCount) {
                                      data.qqpartbyteoffset = chunkSize * partialData.part;
                                      data.qqpartindex = partialData.part;
                                      data.qqchunksize = bytes.length;
                                  }
                              }
                          
                              const formData = new FormData();
                              for (const [key, value] of Object.entries(data))
                                  formData.append(key, value);
                          
                              if(bytes)
                                  formData.append( partialData ?  'qqfile' : 'file', new Blob([bytes]), {filename: contentName, contentType: 'application/octet-stream'});
                          
                              return formData;
                          }
                          
                          let tokenYemot = '';
                          const chunkSize = 20000000;
                          const remotePath = 'ivr2:/';
                          
                          async function uploadFile(filePath) {
                              const fileSize = (await fs.stat(filePath)).size;
                              const callApi = (url, payload) => fetch(url, {method: 'POST', body: payload});
                              const chunks = getChunks(filePath, chunkSize);
                              const contentName = filePath.split('/').pop();
                          
                              if (fileSize <= chunkSize) {
                                  const formData = createFormData((await chunks.next()).value, contentName);
                                  await chunks.return();
                                  return await callApi(baseUrl + '/ym/api/UploadFile', formData).then(x => x.json());
                              } else {
                                  const uuid = crypto.randomUUID();
                                  const partCount = Math.ceil(fileSize / chunkSize);
                          
                                  let part = 0;
                                  for await (const chunk of chunks) {
                                      const formData = createFormData(chunk, contentName, {uuid, fileSize, partCount, part: part++});
                          
                                      const status = await callApi(baseUrl + '/ym/api/UploadFile', formData).then(x => x.json());
                                      if (!status.success) {
                                          console.log(status);
                                          throw new Error(status.message);
                                      }
                                  }
                          
                                  return await callApi(baseUrl + '/ym/api/UploadFile?done', createFormData(null, contentName,
                                      {uuid, fileSize, partCount, part})).then(x => x.text());
                              }
                          }
                          
                          
                          • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                          • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                          תגובה 1 תגובה אחרונה
                          5
                          תגובה
                          • תגובה כנושא
                          התחברו כדי לפרסם תגובה
                          • מהישן לחדש
                          • מהחדש לישן
                          • הכי הרבה הצבעות


                          בא תתחבר לדף היומי!
                          • התחברות

                          • אין לך חשבון עדיין? הרשמה

                          • התחברו או הירשמו כדי לחפש.
                          • פוסט ראשון
                            פוסט אחרון
                          0
                          • דף הבית
                          • קטגוריות
                          • פוסטים אחרונים
                          • משתמשים
                          • חיפוש
                          • חוקי הפורום