AJAX 请求跨源请求被阻止错误
AJAX request Cross-Origin Request Blocked error
我有两个项目;第一个是 asp.net 网络项目,第二个是嵌入式 http 服务器库项目。
嵌入式http服务器项目取自:嵌入式http服务器项目
我想将用户本地的视频文件保存到用户的共享存储中。我正在使用 ajax 请求从浏览器获取和发送文件。嵌入式 http 服务器应该获取字节数组并将视频保存在客户端的共享存储中。我有一个问题,我花了几天时间来解决但还没有找到解决方案。
在 Chrome 它停留在 stream.CopyTo(streamReader);
。
在 Firefox 和 IE 中,它给出 "Cross-Origin Request Blocked" 错误,但 Firefox 保存文件,即使它给出错误。
这里是ajax请求代码:
$(document).ready(function () {
function hashFile(file, chunkSize, callback) {
var size = file.size;
var offset = 0;
var chunk = file.slice(offset, offset + chunkSize);
SendChunk(chunk,0);
var hashChunk = function () {
var reader = new FileReader();
reader.onload = function (e) {
offset += chunkSize;
if (offset < size) {
chunk = file.slice(offset, offset + chunkSize);
SendChunk(chunk,0);
}
else if (offset > size){
offset -= chunkSize;
var newchunkSize = size - offset;
chunk = file.slice(offset, offset + newchunkSize);
SendChunk(chunk,1);
}
};
reader.readAsArrayBuffer(chunk);
};
function SendChunk(chunk,end){
if(end>0)
{
var ajaxRequest = $.ajax({
type: "POST",
url: "http://clientip:8080/savefileend",
contentType: false,
processData: false,
data: chunk
});
}
else{
var ajaxRequest = $.ajax({
type: "POST",
url: "http://clientip:8080/savefile",
contentType: false,
processData: false,
data: chunk
});
ajaxRequest.done(function (e) {
hashChunk();
});
ajaxRequest.error(function (xhr) {
console.log(e);
hashChunk();
});
}
}
}
function fileInputHandler(evt) {
var files = evt.target.files;
var chunkSize = 10485760; // bytes
var start = window.performance ? performance.now() : Date.now(); // DEBUG
var onHashFile = function (digest) {
var end = window.performance ? performance.now() : Date.now(); // DEBUG
console.log(this.name, digest, (end - start) + 'ms'); // DEBUG
};
for (var i = 0, len = files.length; i < len; i++) {
hashFile(files[i], chunkSize, onHashFile);
}
}
document.getElementById('file1')
.addEventListener('change', fileInputHandler, false);
});
这是获取请求的嵌入式服务器代码:
var stream = request.GetRequestStream();
using (var streamReader = new MemoryStream())
{
stream.CopyTo(streamReader);
videoTemp = streamReader.ToArray();
}
using (var fileStream = new FileStream(path, FileMode.Append))
{
fileStream.Write(videoTemp, 0, videoTemp.Length);
}
顺便说一句:
对于 IE:如果我从设置安全中启用 "Access data sources across domains",那么它在 IE 中可以正常工作。
对于 Chrome:如果我用 --disable-web-security parameter
开始 chrome,它在 Chrome 中可以正常工作。但是我已经从代码中找到了解决方案。
可能这个问题出在客户端浏览器上。例如,Google Chrome 默认被阻止跨域。要允许它,您可以使用插件:https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi
我已经找到了解决方案,如果有人需要的话;
我已经为嵌入式 http 服务器使用了 http://nancyfx.org/ Nancy.Hosting.Self 库,在这里我能够将 "Access-Control-Allow-Origin" 添加到 response.Headers 以便我可以无错误地传输文件。
我有两个项目;第一个是 asp.net 网络项目,第二个是嵌入式 http 服务器库项目。
嵌入式http服务器项目取自:嵌入式http服务器项目
我想将用户本地的视频文件保存到用户的共享存储中。我正在使用 ajax 请求从浏览器获取和发送文件。嵌入式 http 服务器应该获取字节数组并将视频保存在客户端的共享存储中。我有一个问题,我花了几天时间来解决但还没有找到解决方案。
在 Chrome 它停留在 stream.CopyTo(streamReader);
。
在 Firefox 和 IE 中,它给出 "Cross-Origin Request Blocked" 错误,但 Firefox 保存文件,即使它给出错误。
这里是ajax请求代码:
$(document).ready(function () {
function hashFile(file, chunkSize, callback) {
var size = file.size;
var offset = 0;
var chunk = file.slice(offset, offset + chunkSize);
SendChunk(chunk,0);
var hashChunk = function () {
var reader = new FileReader();
reader.onload = function (e) {
offset += chunkSize;
if (offset < size) {
chunk = file.slice(offset, offset + chunkSize);
SendChunk(chunk,0);
}
else if (offset > size){
offset -= chunkSize;
var newchunkSize = size - offset;
chunk = file.slice(offset, offset + newchunkSize);
SendChunk(chunk,1);
}
};
reader.readAsArrayBuffer(chunk);
};
function SendChunk(chunk,end){
if(end>0)
{
var ajaxRequest = $.ajax({
type: "POST",
url: "http://clientip:8080/savefileend",
contentType: false,
processData: false,
data: chunk
});
}
else{
var ajaxRequest = $.ajax({
type: "POST",
url: "http://clientip:8080/savefile",
contentType: false,
processData: false,
data: chunk
});
ajaxRequest.done(function (e) {
hashChunk();
});
ajaxRequest.error(function (xhr) {
console.log(e);
hashChunk();
});
}
}
}
function fileInputHandler(evt) {
var files = evt.target.files;
var chunkSize = 10485760; // bytes
var start = window.performance ? performance.now() : Date.now(); // DEBUG
var onHashFile = function (digest) {
var end = window.performance ? performance.now() : Date.now(); // DEBUG
console.log(this.name, digest, (end - start) + 'ms'); // DEBUG
};
for (var i = 0, len = files.length; i < len; i++) {
hashFile(files[i], chunkSize, onHashFile);
}
}
document.getElementById('file1')
.addEventListener('change', fileInputHandler, false);
});
这是获取请求的嵌入式服务器代码:
var stream = request.GetRequestStream();
using (var streamReader = new MemoryStream())
{
stream.CopyTo(streamReader);
videoTemp = streamReader.ToArray();
}
using (var fileStream = new FileStream(path, FileMode.Append))
{
fileStream.Write(videoTemp, 0, videoTemp.Length);
}
顺便说一句:
对于 IE:如果我从设置安全中启用 "Access data sources across domains",那么它在 IE 中可以正常工作。
对于 Chrome:如果我用 --disable-web-security parameter
开始 chrome,它在 Chrome 中可以正常工作。但是我已经从代码中找到了解决方案。
可能这个问题出在客户端浏览器上。例如,Google Chrome 默认被阻止跨域。要允许它,您可以使用插件:https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi
我已经找到了解决方案,如果有人需要的话; 我已经为嵌入式 http 服务器使用了 http://nancyfx.org/ Nancy.Hosting.Self 库,在这里我能够将 "Access-Control-Allow-Origin" 添加到 response.Headers 以便我可以无错误地传输文件。