HTTP üzerinden büyük dosyaları yükleme

6 Cevap php

Ben bir sunucuya (10 ', gibi megabayt olarak 100) bir masaüstü uygulaması dosya potansiyel olarak büyük yüklemek gerekir. Sunucu kodu PHP, C + + / MFC masaüstü uygulamasında yazılmıştır. Ben bu yazılım güvenilmez bağlantıları üzerinden kullanılabilir olacak çünkü yükleme yarıladı başarısız olduğunda dosya yüklemeleri devam edebilmek istiyorum. Benim seçenekleri nelerdir? Böyle http://www.chilkatsoft.com/refdoc/vcCkUploadRef.html mükemmel görünüyor, ama yarı bitti upload (Ben bu varsayalım bir 'özgeçmiş' işlemek için görünmüyor ki gibi C + +, olduğu için HTTP yükleme bileşenleri bir dizi buldum HTTP 1.1 doesn çünkü 't) bunu destekleyecek. Ben de BITS hizmeti baktım ama yüklemeler için bir IIS sunucusu gerektirir. Şimdiye kadar benim tek seçenek ben, daha küçük parçalara (diyelim 1 meg her biri) içine yüklemek sunucuya hepsini yükleyin, PHP ile bunları yenilemek ve herşey yolunda giderse görmek için bir sağlama çalıştırmak istediğiniz dosyayı kesmek gibi görünüyor. Devam ettirmek için, ben adet sunucu üzerinde zaten hangi öğrenmek için yüklenme başında 'el sıkışma' çeşit olması gerekiyordu. Ben elle bu kodu ya da herkes benim için yapar, ya da belki de tamamen farklı bir çözüm bir kütüphane biliyor mu olacak? Doğrusu (güvenlik duvarları ile potansiyel sorunlar vb) bakım nedeniyle doğal devam destekleyen başka protokolüne geçmek istemem

6 Cevap

Ben geç sekiz ay değilim, ama sadece bu soruya tökezledi ve WebDAV belirtilmeyen şaşırdı. Yüklemek için HTTP PUT yöntemini kullanın ve sürdürme ve bu işlemek için bir Content-Range başlığını içerebilir. Dosya zaten var ve ne kadar büyük ise, bir HEAD isteği size söylerdim. Bu gibi pek belki bir şey:

1) uzak dosya HEAD

O var ve boyut == yerel boyutu, yükleme zaten yapılır 2) ise

3) Eğer boyut < yerel boyutu, istek ve yerel dosyada uygun konuma aramak için bir Content-Range başlığını ekleyin.

4) sürdürme durumunda, dosyayı (ya da dosyanın bölümünü yüklemek için PUT isteği olun)

Bağlantı PUT isteği sırasında başarısız olursa 5), ​​adım 1 ile başlamak

Ayrıca liste (değil.PROPFIND) can ve (HAREKET) dosyalarını yeniden adlandırın ve dav ile dizinleri (MKCOL) oluşturun.

Apache ve Lighttpd hem dav uzantıları var inanıyorum.

Eğer standart bir boyut (256k demek) gerekir. Kullanıcı x tarafından yüklenen dosya "abc.txt", 78.3MB ise bu 313 tam parçaları ve bir küçük yığın olurdu.

  1. Sen belirten dosya adı ve boyutu yanı sıra, ilk iş parçacığı sayısını yüklemek için bir istek gönderin.
  2. kodu php, IP adresi ve dosya adını bir geçici klasör oluşturmak olacaktır
  3. Sizin uygulamayı daha sonra farklı evrelerde veri göndermek için ÇOK bağlantıları kullanabilirsiniz, böylece (ayrı sağlama ile) aynı anda 1111212313 boyutta gönderme olabilir.
  4. php kodu farklı dosyalara kaydeder ve göndermek için, ya da bu konu ile durdurmak için yeni bir yığın numarasını vererek, sağlama doğrulama sonra resepsiyon onaylar.
  5. Tüm iplik bittikten sonra bir şey eksik, sen, tüm dosyaları katılmak için php rica ederim, olur Goto 3

App gönderen kontrol ediyor beri, irade parçacığı sayısını artırmak veya azaltmak.

Kolayca basit bir ilerleme çubuğu veya en parçalarını ayrıntılı bir görünümünü DownThemAll yakın bir şey ya bir ilerleme göstergesi gösterebilir.

libcurl (C API) bir seçenek olabilir

-C/--continue-at Continue/Resume a previous file transfer at the given offset. The given offset is the exact number of bytes that will be skipped, counting from the beginning of the source file before it is transferred to the destination. If used with uploads, the FTP server command SIZE will not be used by curl. Use "-C -" to tell curl to automatically find out where/how to resume the transfer. It then uses the given output/input files to figure that out. If this option is used several times, the last one will be used

Google Resumable HTTP Yükle protokolü oluşturduk. Bkz https://developers.google.com/gdata/docs/resumable_upload

Bütün tersine bir seçenek proccess? Yani, bunun yerine sunucu üzerinde dosya itme sunucu standart HTTP tüm çan ve ıslık (gibi kabul-aralıkları, vb) ile GET kullanarak dosyayı çekin yapmak.

Belki de en kolay yöntem (belki sunucunun sahip aralıkları incelemek için bir işlev eklemek olabilir böyle http://yourpage/.../upload.php?file=myfile&from=123456 olarak parametre dosya ve aralığı, kabul ve istemci özgeçmiş ele verecek bir yükleme sayfası oluşturmak olacaktır ) Alınan