2015-01-25 2 views
2

Я работаю над проектом, где мне нужно загрузить небольшой бит JSON с файлом, работающим в AngularJS.AngularJS как отправить multipart/mixed

Я написал код, используя угловую-файл-загрузки Даниала Фарида, и он работает, за исключением того, что всегда посылает «многокомпонентные/форм-данных, краевым = < независимо >»

Однако я MUST использование многосторонний/смешанный.

Это мой призыв:

$scope.upload = $upload.upload({ 
    url: <my url>, 
    method: 'POST', 
    data: $scope.data, 
     file: file, 
}).progress(function(evt) { 
    console.log('percent: ' + parseInt(100.0 * evt.loaded/evt.total)); 
}).success(function(data, status, headers, config) { 
    // file is uploaded successfully 
    console.log(data); 
}); 

Есть ли способ изменить заголовки только прежде чем он будет отправлен?

Если вы не используете его загрузку с угловым файлом, то другим способом, надеюсь, без необходимости «сворачивать мою собственную» функцию?

Edit 1:

Я просто не могу понять, как это может быть так трудно сделать это изменение. Конечно, вы можете добавить

headers: {'Content-Type': 'multipart/mixed'} 

Но это абсолютно НИЧЕГО, потому что нет границы. Почему не может быть выход из границы? Что-то вроде

headers: {'Content-Type': 'multipart/mixed, boundary=%b'} 

Мне нужно, чтобы эта работа как можно скорее.

ответ

5

Я больше не мог ждать. Я закончил свой собственный, и он действительно работает. Вот код ... надеюсь, другие могут принести пользу.

file_contents - это результат чтения.readAsArrayBuffer ($ scope.files [0]);

Вам необходимо создать кадр из текста преамбулы, данных файла и нижнего колонтитула, поскольку в противном случае добавление двоичных данных в строку будет выполнять преобразования в двоичных файлах данных, и это не сработает должным образом.

var epochTicks = 621355968000000000; 
var ticksPerMillisecond = 10000; 
var yourTicks = epochTicks + ((new Date).getTime() * ticksPerMillisecond); 

var boundary='---------------------------'+yourTicks; 

var header="--"+boundary+"\r\n"; 

var footer="\r\n--"+boundary+"--\r\n"; 

var contenttype="multipart/mixed; boundary="+boundary; 

var contents=header+"Content-Disposition: form-data; name=\"json\"\r\n"; 
contents+="Content-Type: application/json\r\n"; 
contents+="Content-Length: "+JSON.stringify(data).length+"\r\n\r\n"; 
contents+=JSON.stringify(data)+"\r\n"; 

contents+=header+"Content-Disposition: form-data; name=\"image\"; filename=\""+$scope.files[0].name+"\"\r\n"; 
contents+="Content-Transfer-Encoding: binary\r\n"; 
contents+="Content-Type: "+$scope.files[0].type+"\r\n"; 
contents+="Content-Length: "+$scope.files[0].size+"\r\n\r\n"; 

blob=new Blob([contents,file_contents,footer]); 

$http.post(restUrl+"user/avatar/uploadAvatar",blob,{'headers':{'Content-Type':contenttype}}). 
success(function (data, status, headers, config) { 
    alert("success!"); 
}). 
error(function (data, status, headers, config) { 
    alert("failed!"); 
}); 
+0

100 благодаря вам чувак .. Я пытался это от 2-3weeks без удачи, пытаясь ваше решение, была исправлена ​​в одной попытке ... –

+0

я даже отправил quetion тоже. http://stackoverflow.com/questions/31829025/content-type-for-json-and-audio-file –

+0

Отлично! Рад, что смог помочь! –

Смежные вопросы