Javascript Office应用程序,如何使用ajax将文档文件副本发送到C#controller
你好,我有这个问题: 我有一个办公地址(word) 我想将当前文件(.docx)的副本发送给C#controller,我现在有了这个代码,在代码的这个阶段,我在“yourfile”中得到了一个字符数组或其他一些东西,我怎样才能得到一个.docx文件 JavaScriptJavascript Office应用程序,如何使用ajax将文档文件副本发送到C#controller,javascript,c#,.net,ajax,office-app,Javascript,C#,.net,Ajax,Office App,你好,我有这个问题: 我有一个办公地址(word) 我想将当前文件(.docx)的副本发送给C#controller,我现在有了这个代码,在代码的这个阶段,我在“yourfile”中得到了一个字符数组或其他一些东西,我怎样才能得到一个.docx文件 JavaScript function sendFile() { Office.context.document.getFileAsync("compressed", { sliceSize: 100000 },
function sendFile() {
Office.context.document.getFileAsync("compressed",
{ sliceSize: 100000 },
function (result) {
if (result.status == Office.AsyncResultStatus.Succeeded) {
var myFile = result.value;
var state = {
file: myFile,
counter: 0,
sliceCount: myFile.sliceCount
};
getSlice(state);
}
});
}
function getSlice(state) {
state.file.getSliceAsync(state.counter, function (result) {
if (result.status == Office.AsyncResultStatus.Succeeded) {
sendSlice(result.value, state);
}
});
}
function myEncodeBase64(str)
{
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
function sendSlice(slice, state) {
var data = slice.data;
if (data) {
var fileData = myEncodeBase64(data);
var _url = '../../api/file';
useAjax(_url, 'Post', JSON.stringify(fileData), _contentType).done(function (data) {
writeData(data);
app.showNotification("Translation was successfully done!");
});
}
}
function sendSlice(slice, state) {
var data = slice.data;
if (data) {
var isLastSlice = state.counter >= (state.sliceCount -1);
var ajaxData = {
isLastSlice: isLastSlice,
counter: state.counter,
documentData: btoa(data)
}
$.ajax({
url: "/api/Constructpptx", method: "POST", data: ajaxData, success: function (result) {
state.counter++;
if (isLastSlice) {
closeFile(state);
}
else {
getSlice(state);
}
}, error: function (xhr, status, error) {
}
});
}
}
和C#控制器:
public static string filemame = @"c:\yourfile";
[Route("file")]
[HttpPost]
public void getFile([FromBody] string data)
{
Base64ToFile(data,filemame);
}
public static void Base64ToFile(string base64String, string filename)
{
byte[] fileByteArray = Convert.FromBase64String(base64String);
// Instantiate FileStream to create a new file
System.IO.FileStream writeFileStream = new System.IO.FileStream(filename, System.IO.FileMode.Create, System.IO.FileAccess.Write);
// Write converted base64String to newly created file
writeFileStream.Write(fileByteArray, 0, fileByteArray.Length);
// Clean up / disposal
writeFileStream.Close();
}
晚会迟到了,但我还是在这里补充答案,以防以后有人需要 您应该使用myEncodeBase64,而不是使用myEncodeBase64
var fileData = OSF.OUtil.encodeBase64(data);
它是一个函数,是Office API的一部分,因此您无需定义任何其他内容 我一直在努力构建正确的pptx服务器端。最终这就是我想到的 Javascript
function sendFile() {
Office.context.document.getFileAsync("compressed",
{ sliceSize: 100000 },
function (result) {
if (result.status == Office.AsyncResultStatus.Succeeded) {
var myFile = result.value;
var state = {
file: myFile,
counter: 0,
sliceCount: myFile.sliceCount
};
getSlice(state);
}
});
}
function getSlice(state) {
state.file.getSliceAsync(state.counter, function (result) {
if (result.status == Office.AsyncResultStatus.Succeeded) {
sendSlice(result.value, state);
}
});
}
function myEncodeBase64(str)
{
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
function sendSlice(slice, state) {
var data = slice.data;
if (data) {
var fileData = myEncodeBase64(data);
var _url = '../../api/file';
useAjax(_url, 'Post', JSON.stringify(fileData), _contentType).done(function (data) {
writeData(data);
app.showNotification("Translation was successfully done!");
});
}
}
function sendSlice(slice, state) {
var data = slice.data;
if (data) {
var isLastSlice = state.counter >= (state.sliceCount -1);
var ajaxData = {
isLastSlice: isLastSlice,
counter: state.counter,
documentData: btoa(data)
}
$.ajax({
url: "/api/Constructpptx", method: "POST", data: ajaxData, success: function (result) {
state.counter++;
if (isLastSlice) {
closeFile(state);
}
else {
getSlice(state);
}
}, error: function (xhr, status, error) {
}
});
}
}
作为API后端,我使用这个
C#ApiController
public class ConstructpptxController : ApiController
{
public static List<byte> Document { get; set; } = new List<byte>();
public string Post([FromBody]ConstructpptxPayload payload)
{
if (payload.counter == 0)
Document.Clear();
var payloadData = Convert.FromBase64String(payload.documentData);
var pptBytes = Encoding.UTF8.GetString(payloadData).Split(',').Select(byte.Parse).ToArray();
Document.AddRange(pptBytes);
if(payload.isLastSlice)
{
var path = @"C:/Some/Local/Path/Presentation.pptx";
var fileStream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite);
fileStream.Write(Document.ToArray(), 0, Document.Count());
fileStream.Close();
Document.Clear();
}
return $"Counter: {payload.counter}, isLast: {payload.isLastSlice}, docLength: {Document.Count}";
}
}
public class ConstructpptxPayload
{
public bool isLastSlice { get; set; }
public int counter { get; set; }
public string documentData { get; set; }
}
公共类构造函数pptxcontroller:ApiController
{
公共静态列表文档{get;set;}=new List();
公共字符串Post([FromBody]ConstructpptxPayload有效负载)
{
if(payload.counter==0)
Document.Clear();
var payloadData=Convert.FromBase64String(payload.documentData);
var pptBytes=Encoding.UTF8.GetString(payloadData).Split(',').Select(byte.Parse).ToArray();
Document.AddRange(ppt字节);
if(有效负载.isLastSlice)
{
var path=@“C:/Some/Local/path/Presentation.pptx”;
var fileStream=newfilestream(路径,FileMode.Create,FileAccess.ReadWrite);
Write(Document.ToArray(),0,Document.Count());
fileStream.Close();
Document.Clear();
}
返回$“计数器:{payload.Counter},isLast:{payload.isLastSlice},docLength:{Document.Count}”;
}
}
公共类构造函数pptxPayLoad
{
公共布尔isLastSlice{get;set;}
公共int计数器{get;set;}
公共字符串documentData{get;set;}
}
请注意:仅将此示例用作快速起点,因为您不想将字节保存在静态列表文档中。相反,您希望使您的Web服务器成为无状态。这正是您所需要的。直到我看到你的答案,我才知道这个存在。谢谢。您也可以使用javascript内置的Base64:btoa编码。这使得var fileData=btoa(数据);