2015-03-23 2 views
1

Я создаю приложение GAE с использованием WebApp2, имеющего объект данных клиента. Каждый клиент имеет уникальный идентификатор, и я хочу разрешить пользователю загружать один или несколько файлов, связанных с этим конкретным объектом клиента. Я знаю, что это возможно с помощью blobstore, GCS, но я экспериментирую с Titan Files, который имеет возможность использовать блэк-сервер blobstore, позволяя мне создавать систему каталогов файлов для моих пользователей. Я довольно новичок в программировании GAE, поэтому любая помощь будет принята с благодарностью!Загрузить обработчик для файла с добавленной информацией

Я использую FormData object, чтобы добавить другую полезную информацию в мой файл (имя файла и путь к каталогу с «папкой» и «подпапкой», в которую я хочу записать файл). С консоли firebug мое сообщение, похоже, срабатывает правильно, так как я вижу сообщение с большим количеством странных символов (файл) и других данных, которые я добавляю к файлу (имя файла и путь, на который я хочу, чтобы он записывался так, как описано выше) , Тем не менее, я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
File "C:\lib\webapp2-2.5.2\webapp2.py", line 1535, in __call__ 
rv = self.handle_exception(request, response, e) 
File "C:\lib\webapp2-2.5.2\webapp2.py", line 1529, in __call__ 
rv = self.router.dispatch(request, response) 
File "C:\lib\webapp2-2.5.2\webapp2.py", line 1278, in default_dispatcher 
return route.handler_adapter(request, response) 
File "C:\lib\webapp2-2.5.2\webapp2.py", line 1102, in __call__ 
return handler.dispatch() 
File "C:\lib\webapp2-2.5.2\webapp2.py", line 572, in dispatch 
return self.handle_exception(e, self.app.debug) 
File "C:\lib\webapp2-2.5.2\webapp2.py", line 570, in dispatch 
return method(*args, **kwargs) 

File "C:\Users\Owner\Documents\vein\vann-vein\main.py", line 121, in post 
myfile = self.request.post(self) 
File "C:\lib\webob-1.1.1\webob\request.py", line 1238, in __getattr__ 
raise AttributeError(attr) 
AttributeError: post 
INFO  2015-03-21 13:55:19,667 module.py:666] default: "POST /uploadfile  HTTP/1.1" 500 1469 

Я довольно уверен, этот вопрос находится в моем UploadHandler, но будет предоставлять другие элементы MVC для полного контекста ... Я не ясно ли я с помощью GET/POST правильно.

Мой HTML Форма:

<div class="form-group"> 
     <label class="control-label col-sm-4" for="clientNumber">Client Number*:</label> 
      <div class="col-sm-8"> 
       <input type="text" class="form-control" id="clientNumber" placeholder="Client 1111111" disabled> 
      </div> 
    </div> 

    <div class="form-group"> 
     <label class="control-label col-sm-4" for="clientDocs">Client Docs:</label>      
      <div class="col-sm-8"> 
       <input type="file" type="file" name="file" id="file"><br> 
       <button type="button" class="btn btn-info" id="clientDocsButton" onclick="addFile()" disabled>Add File</button><br> 
      </div> 
    </div> 

Мои Javascript называют:

function addFile() 
{ 
console.log("Pre-Instantiation."); 
var filepath = window.location.pathname; 
var subfolder = document.getElementById("clientNumber").value 
var myfile = document.getElementById("file"); 
var filename = document.getElementById("file").value; 

console.log("Post-Instantiation."); 
var formData = new FormData(); 
formData.append('thefile', myfile.files[0]); 
formData.append('filepath', filepath); 
formData.append('subfolder', subfolder); 
formData.append('filename', filename); 
console.log("Pre-AJAX."); 
console.log(typeof formData['thefile']); 

$.ajax({ 
    url: '/uploadfile', //Server script to process data 
    type: 'POST', 
    xhr: function() { // Custom XMLHttpRequest 
     var myXhr = $.ajaxSettings.xhr(); 
     if(myXhr.upload){ // Check if upload property exists 
      myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // For handling the progress of the upload 
     } 
     return myXhr; 
    }, 
    //Ajax events 
    success: function(response) { 
     bootbox.alert(response); 
    }, 
    error : function(xhr,errmsg,err) { 
     bootbox.alert(xhr.status); 
    }, 
    data: formData, 
    //Options to tell jQuery not to process data or worry about content-type. 
    cache: false, 
    contentType: false, 
    processData: false 
})}; 

Мой Главная - UploadHandler:.

class UploadHandler(webapp2.RequestHandler): 
def post(self): 
    myfile = self.request.post(self) 
    myfile = formData['thefile'] 
    filepath = myfile['filepath'] 
    subfolder = myfile['subfolder'] 
    filename = myfile['filename'] 

    files.File('/' + filepath + '/' + subfolder + '/' + filename).write(myfile) 
    self.response.write("Save successful") 

Примечание: files.File() писать () выше, является частью библиотеки Titan Files, которая импортируется в мой Main.py

ответ

0

Вы можете получить все представленные данные из объекта запроса, с помощью метода get, нет необходимости создавать какие-либо другие объекты:

class UploadHandler(webapp2.RequestHandler): 
    def post(self): 
     myfile = self.request.get('thefile') 
     filepath = self.request.get('filepath') 
     subfolder = self.request.get('subfolder') 
     filename = self.request.get('filename') 

     files.File('/' + filepath + '/' + subfolder + '/' + filename).write(myfile) 
     self.response.write("Save successful") 
+1

Это было совершенно проблема. Не могу сказать, насколько я ценю вас, глядя на это и помогая мне это исправить. Сколько минут вы потратили бы на меня. СПАСИБО! – Sanders