C# | העלאת קובץ גדול מ50 מגה בAPI לימות המשיח בחלקים
-
תגובה: העלאת קובץ ב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");
-
@ivrtikshoret אכן זה היה הבעיה!
לא שמתי לב לזה לפני זה בשרשור המקורי..
עדכנתי את הקוד למעלה לקוד התקין, אם יש מישהו שצריך...
-
@אביי כתב בC# | העלאת קובץ גדול מ50 מגה בAPI לימות המשיח בחלקים:
(שימו לב שבקבצים קטנים מ50 מגה (העלאה רגילה) השם המקורי שנשמר בפרטי הקובץ משבש את התווים העבריים, בהעלאה בחלקים זה נשמר בפרטי הקובץ בצורה טובה)
האתר של ימות מעלה גם קבצים מתחת 50 מגה באותה צורה (בחלקים עם פניה ל
UploadFile?done
בסוף). אולי כדאי לבדוק מה גורם לשגיאה בהעלאת פחות מ50 בחלקים -
@צדיק-תמים לא הבנתי מה בדיוק התכוונת,
עכ"פ מנסינות עקרים כבר תקופה, נראה שהבעיה היא בימות,
מה שכן שמתי לב, שבהעלאה של קובץ עם מספור אוטומטי ללא המרה (זה חייב להיות wav בשביל המספור), השם נשמר תקין גם בהעלאה של קובץ יחיד.
ניתן לכאורה (ואולי לזה התכוונת) להעלות תמיד בחלקים, ואז זה יפתור את הבעיה, אבל משום מה תמיד כשאני עושה ככה הקובץ אמנם מושמע תקין אבל הגודל שלו מתנפח לפי שניים לפחות..
-
@אביי כתב בC# | העלאת קובץ גדול מ50 מגה בAPI לימות המשיח בחלקים:
ניתן לכאורה (ואולי לזה התכוונת) להעלות תמיד בחלקים, ואז זה יפתור את הבעיה, אבל משום מה תמיד כשאני עושה ככה הקובץ אמנם מושמע תקין אבל הגודל שלו מתנפח לפי שניים לפחות..
כן, לזה התכוונתי. מעניין מה שאתה אומר, לא שמתי לב שזה קורה באתר החדש.