Я использую FineUploader для многих версий, и мне ОЧЕНЬ нравится то, что вы, ребята, сделали. Это касается v5.3.0 с использованием оболочки jquery.
Проект, над которым я сейчас работаю, должен разбивать файлы на части (некоторые из них имеют размер до 2 ГБ), и я вроде как разбил на части файлы. Я могу загрузить несколько кусков, и это все.
Созданный мной процесс создания фрагментов создает папку на основе qqUUID и сбрасывает фрагменты в эту папку. Части именуются только по их qqpartindex (0, 1, 2 и т. д.), поэтому их можно заказать позже и перестроить. На данный момент я еще не зашел так далеко, поэтому, пожалуйста, поправьте меня, если это неправильно. Я могу сохранить только 3 файла, прежде чем получаю сообщение об ошибке (для тестового файла размером 20 МБ). Я получаю эту ошибку: «XHR вернул код ответа 0», хотя я не выполняю межсайтовые сценарии (локально работающее приложение с правильными разрешениями на сохранение сетевых ресурсов), и я ВСЕГДА могу сохранить 3 файла и все. Странно, что я могу заставить некоторых работать, но это все. Что мне не хватает? Спасибо за вашу помощь!
См. код Fineuploader на стороне клиента ниже, который работает:
<script type="text/javascript">
var filesToUpload = 0;
var uploadedFileCounter = 0;
var po = '@Model.PurchaseOrder';
var companyNumber = '@Model.CompanyNumber';
$().ready(function () {
var fineuploader = $('#files-upload').fineUploader({
debug: false,
template: 'qq-template',
button: $("#uploadButton"),
request:
{
endpoint: '@Url.Action("UploadFile", "Upload")',
forceMultipart: true,
customHeaders: { Accept: 'application/json' },
params: {
po: (function () { return po; }),
companyNumber: (function () { return companyNumber; }),
}
},
validation: {
acceptFiles: ['image/*', +
'audio/mp4a-latm'],
allowedExtensions: ['jpeg', 'jpg', 'gif', 'png', 'bmp', 'm4a'],
sizeLimit: 1024 * 1024 * 1024 * 2, // 2 GB
stopOnFirstInvalidFile: false
},
chunking: {
enabled: true,
concurrent: {
enabled: true
},
mandatory: true,
success: {
endpoint: '@Url.Action("UploadChunksComplete", "Upload")'
}
//, expected: false // allow cross-domain requests
},
failedUploadTextDisplay: {
mode: 'custom'
},
multiple: true
}).on('submitted', function (event, id, filename) {
filesToUpload++;
$(':input[type=button], :input[type=submit], :input[type=reset]').attr('disabled', 'disabled');
}).on('complete', function (event, id, filename, responseJSON) {
uploadedFileCounter++;
if (filesToUpload == uploadedFileCounter) {
$(':input[type=button], :input[type=submit], :input[type=reset]').removeAttr('disabled');
}
}).on('error', function (event, id, name, errorReason, xhr) {
alert('error: ' + errorReason);
});
});
The server side code for chunks looks like this, which 'works' and I can step into it:
[HttpPost]
public HttpResponseMessage UploadFile(HttpPostedFileWrapper qqfile, string po, string companyNumber)
{
var id = Request["qquuid"];
var filename = (Request["qqpartindex"]);
var x = FileProcessor.Storage.SaveChunk(qqfile, id, filename, Config.Instance.TemporaryChunkDirectory);
var response = new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
return response;
}
Метод SaveChunk, являющийся частью отдельного проекта, показан ниже:
public static bool SaveChunk(HttpPostedFileWrapper file, string id, string filename, string fileTemporarySavePath)
{
if (!VerifyFile(file)) { return false; }
if (filename == null) { filename = "0"; } // creating index 0 for files that don't actually need chunk
Common.CreateTempDirectory(fileTemporarySavePath, id);
try
{
var pathfilename = string.Join("\\", fileTemporarySavePath, id, filename);
file.SaveAs(pathfilename);
return true;
}
catch (Exception ex)
{
var error = ex.Message.ToString();
return false;
}
}
chunking.concurrent
? С выключенным все нормально работает? - person Ray Nicholus   schedule 14.09.2015