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

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

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. C# | העלאת קובץ גדול מ50 מגה בAPI לימות המשיח בחלקים

C# | העלאת קובץ גדול מ50 מגה בAPI לימות המשיח בחלקים

מתוזמן נעוץ נעול הועבר תכנות
7 פוסטים 3 כותבים 262 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • אבייא מנותק
    אבייא מנותק
    אביי
    כתב ב נערך לאחרונה על ידי אביי
    #1

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

    אני גם כן נתקל בבעיה דומה בקוד C#, מתעבורת הרשת נראה בבירור שהחלקים נשלחים היטב לשרת, אבל בסוף אני מקבל קובץ ריק, (התגובה מימות תקינה ומופיע שגודל הקובץ הוא 0)

    דבר נוסף שייתכן שהא בהא תליא, למרות שמוגדר autoNumbering וconvertAudio בפועל הקובץ לא מומר (לכאורה) והוא נשמר עם השם המקורי.

    יצויין שקבצים קטנים מ50 מגה עולים היטב, ומומרים וממוספרים כהוגן.

    להלן הקוד הרלוונטי, וכאן התיעוד

    אם צריך טוקן בשביל לבדוק אפשר ליצור קשר בפרטי

    עדכון: הקוד עודכן וכעת הוא עובד היטב,

    (שימו לב שבקבצים קטנים מ50 מגה (העלאה רגילה) השם המקורי שנשמר בפרטי הקובץ משבש את התווים העבריים, בהעלאה בחלקים זה נשמר בפרטי הקובץ בצורה טובה)

    public class YemotUploader
    {
        private const int ChunkSize = 5000000;
    
        private async Task<List<byte[]>> ReadInChunksAsync(string filePath)
        {
            var chunks = new List<byte[]>();
    
            using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                byte[] buffer = new byte[ChunkSize];
                int bytesRead;
    
                while ((bytesRead = await fileStream.ReadAsync(buffer, 0, ChunkSize)) > 0)
                {
                    var chunk = new byte[bytesRead];
                    Array.Copy(buffer, chunk, bytesRead);
                    chunks.Add(chunk);
                }
            }
            return chunks;
        }
    
        public async Task<Dictionary<string, string>> UploadFileAsync(
            string filePath,
            string path,
            string tokenYemot
        )
        {
            if (new FileInfo(filePath).Length > 5000000)
            {
                var contentName = Path.GetFileName(filePath);
                var contentPath = Path.GetFullPath(filePath);
                var contentSize = new FileInfo(contentPath).Length;
                var qquuid = Guid.NewGuid().ToString();
                var chunks = await ReadInChunksAsync(contentPath);
                var offset = 0;
                foreach (var chunk in chunks)
                {
                    using (var httpClient = new HttpClient())
                    using (var content = new MultipartFormDataContent())
                    {
                        content.Add(new StringContent(tokenYemot), "token");
                        content.Add(new StringContent(path), "path");
                        content.Add(new StringContent(qquuid), "qquuid");
                        content.Add(new StringContent("1"), "convertAudio");
                        content.Add(new StringContent("true"), "autoNumbering");
                        content.Add(new StringContent("yemot-admin"), "uploader");
                        content.Add(new StringContent(contentName), "qqfilename");
                        content.Add(new StringContent(contentSize.ToString()), "qqtotalfilesize");
                        content.Add(new StringContent(chunks.Count.ToString()), "qqtotalparts");
                        content.Add(new StringContent(chunk.Length.ToString()), "qqchunksize");
                        content.Add(new StringContent(offset.ToString()), "qqpartbyteoffset");
                        content.Add(new StringContent(chunks.IndexOf(chunk).ToString()), "qqpartindex");
                        content.Add(
                            new ByteArrayContent(chunk)
                            {
                                Headers =
                                {
                                    ContentDisposition =
                                        new System.Net.Http.Headers.ContentDispositionHeaderValue(
                                            "form-data"
                                        )
                                        {
                                            Name = "\"qqfile\"",
                                            FileName = $"\"{contentName}\"",
                                        },
                                    ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(
                                        "application/octet-stream"
                                    )
                                }
                            },
                            "qqfile"
                        );
    
                        var response = await httpClient.PostAsync(
                            "https://www.call2all.co.il/ym/api/UploadFile",
                            content
                        );
                        offset += chunk.Length;
                    }
                }
    
                var doneData = new Dictionary<string, string>
                {
                    { "token", tokenYemot },
                    { "path", path },
                    { "uploader", "yemot-admin" },
                    { "convertAudio", "1" },
                    { "autoNumbering", "true" },
                    { "qquuid", qquuid },
                    { "qqfilename", contentName },
                    { "qqtotalfilesize", contentSize.ToString() },
                    { "qqtotalparts", chunks.Count.ToString() },
                };
    
                using (var httpClient = new HttpClient())
                {
                    var doneResponse = await httpClient.PostAsync(
                        "https://www.call2all.co.il/ym/api/UploadFile?done",
                        new FormUrlEncodedContent(doneData)
                    );
                    var doneResponses = (await doneResponse.Content.ReadAsStringAsync()).Split("}{");
    
                    foreach (var response in doneResponses)
                    {
                        try
                        {
                            Console.WriteLine(response);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("Error decoding JSON: " + ex.Message);
                        }
                    }
                }
    
                return null;
            }
            else
            {
                var url = "https://www.call2all.co.il/ym/api/UploadFile";
                var parameters = new Dictionary<string, string>
                {
                    { "token", tokenYemot },
                    { "path", path },
                    { "convertAudio", "1" },
                    { "autoNumbering", "true" },
                };
    
                using (var httpClient = new HttpClient())
                using (var formData = new MultipartFormDataContent())
                {
                    foreach (var parameter in parameters)
                    {
                        formData.Add(new StringContent(parameter.Value), parameter.Key);
                    }
    
                    var streamContent = new StreamContent(File.OpenRead(filePath));
                    streamContent.Headers.ContentDisposition =
                        new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data")
                        {
                            Name = "\"file\"",
                            FileName = $"\"{Path.GetFileName(filePath)}\"",
                        };
                    formData.Add(streamContent, "file");
    
                    var response = await httpClient.PostAsync(url, formData);
                    var jsonResponse = await response.Content.ReadAsStringAsync();
    
                    Console.WriteLine(jsonResponse);
    
                    return null;
                }
            }
        }
    }
    
    

    אני קורא לזה כך

    string path = textBox1.Text;
    var fileUploader = new YemotUploader();
    await fileUploader.UploadFileAsync(path, "ivr2:1", "079999999:12345");
    

    ניתן ליצור עימי קשר 8140hp+t@gmail.com | קטלוג מוצרים
    הלינקיה שלי https://abaye.co/link.html

    I צדיק תמיםצ 2 תגובות תגובה אחרונה
    0
    • I מנותק
      I מנותק
      ivrtikshoret
      השיב לאביי ב נערך לאחרונה על ידי
      #2

      @אביי
      אני לא מכיר כל כך C# אבל לכאורה זה אותה בעייה אתה צריך לשלוח contentType תנסה לבדוק איך אפשר לשלוח ב C# contentType

      אבייא תגובה 1 תגובה אחרונה
      3
      • אבייא מנותק
        אבייא מנותק
        אביי
        השיב לivrtikshoret ב נערך לאחרונה על ידי
        #3

        @ivrtikshoret אכן זה היה הבעיה!

        לא שמתי לב לזה לפני זה בשרשור המקורי..

        עדכנתי את הקוד למעלה לקוד התקין, אם יש מישהו שצריך...

        ניתן ליצור עימי קשר 8140hp+t@gmail.com | קטלוג מוצרים
        הלינקיה שלי https://abaye.co/link.html

        תגובה 1 תגובה אחרונה
        2
        • צדיק תמיםצ מנותק
          צדיק תמיםצ מנותק
          צדיק תמים
          השיב לאביי ב נערך לאחרונה על ידי צדיק תמים
          #4

          @אביי כתב בC# | העלאת קובץ גדול מ50 מגה בAPI לימות המשיח בחלקים:

          (שימו לב שבקבצים קטנים מ50 מגה (העלאה רגילה) השם המקורי שנשמר בפרטי הקובץ משבש את התווים העבריים, בהעלאה בחלקים זה נשמר בפרטי הקובץ בצורה טובה)

          האתר של ימות מעלה גם קבצים מתחת 50 מגה באותה צורה (בחלקים עם פניה לUploadFile?done בסוף). אולי כדאי לבדוק מה גורם לשגיאה בהעלאת פחות מ50 בחלקים

          Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
          טיפים

          אבייא תגובה 1 תגובה אחרונה
          0
          • אבייא מנותק
            אבייא מנותק
            אביי
            השיב לצדיק תמים ב נערך לאחרונה על ידי אביי
            #5

            @צדיק-תמים לא הבנתי מה בדיוק התכוונת,

            עכ"פ מנסינות עקרים כבר תקופה, נראה שהבעיה היא בימות,

            מה שכן שמתי לב, שבהעלאה של קובץ עם מספור אוטומטי ללא המרה (זה חייב להיות wav בשביל המספור), השם נשמר תקין גם בהעלאה של קובץ יחיד.

            ניתן לכאורה (ואולי לזה התכוונת) להעלות תמיד בחלקים, ואז זה יפתור את הבעיה, אבל משום מה תמיד כשאני עושה ככה הקובץ אמנם מושמע תקין אבל הגודל שלו מתנפח לפי שניים לפחות..

            ניתן ליצור עימי קשר 8140hp+t@gmail.com | קטלוג מוצרים
            הלינקיה שלי https://abaye.co/link.html

            צדיק תמיםצ תגובה 1 תגובה אחרונה
            0
            • צדיק תמיםצ מנותק
              צדיק תמיםצ מנותק
              צדיק תמים
              השיב לאביי ב נערך לאחרונה על ידי
              #6

              @אביי כתב בC# | העלאת קובץ גדול מ50 מגה בAPI לימות המשיח בחלקים:

              ניתן לכאורה (ואולי לזה התכוונת) להעלות תמיד בחלקים, ואז זה יפתור את הבעיה, אבל משום מה תמיד כשאני עושה ככה הקובץ אמנם מושמע תקין אבל הגודל שלו מתנפח לפי שניים לפחות..

              כן, לזה התכוונתי. מעניין מה שאתה אומר, לא שמתי לב שזה קורה באתר החדש.

              Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
              טיפים

              אבייא תגובה 1 תגובה אחרונה
              0
              • אבייא מנותק
                אבייא מנותק
                אביי
                השיב לצדיק תמים ב נערך לאחרונה על ידי אביי
                #7

                באתר החדש.

                @צדיק-תמים אני מדבר (תמיד) רק על האתר הישן, נכנסתי לחדש בפעם האחרונה לפני שנה או אולי אפילו שנתיים.. (אני לא מנהל מערכות באופן שוטף, ומבחינת הפיתוח נראה לי הישן יותר טוב, אבל האמת שאפי' לא ניסיתי את החדש..)

                ניתן ליצור עימי קשר 8140hp+t@gmail.com | קטלוג מוצרים
                הלינקיה שלי https://abaye.co/link.html

                תגובה 1 תגובה אחרונה
                0

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

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

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